diff --git a/binding/web/package.json b/binding/web/package.json index 60a33bf..b618a2b 100644 --- a/binding/web/package.json +++ b/binding/web/package.json @@ -3,7 +3,7 @@ "description": "", "author": "Picovoice Inc", "license": "Apache-2.0", - "version": "1.0.0", + "version": "1.0.1", "keywords": [ "web", "ai", @@ -29,7 +29,7 @@ "test": "cypress run --spec test/picollm.test.ts --browser chrome --headed" }, "dependencies": { - "@picovoice/web-utils": "~1.4.0" + "@picovoice/web-utils": "~1.4.1" }, "devDependencies": { "@babel/core": "^7.21.3", diff --git a/binding/web/yarn.lock b/binding/web/yarn.lock index 27d85b2..c465193 100644 --- a/binding/web/yarn.lock +++ b/binding/web/yarn.lock @@ -1119,10 +1119,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@picovoice/web-utils@~1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@picovoice/web-utils/-/web-utils-1.4.0.tgz#ebcf5847b61311217d0db95cdd8c1721484435af" - integrity sha512-7xwnXzQEOj3a9x58RsZ77ykrmrQg6+HI8NfzHXlqqlAewunnZ7VaLEhdJVtzaM+rOzTUJOTL0bqbx2eOgHEbyw== +"@picovoice/web-utils@~1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@picovoice/web-utils/-/web-utils-1.4.1.tgz#207c5e308b1f7b9127bab83b4b3d9a653d630ffb" + integrity sha512-WoC+PAYXEpeLzq76URCX+UC5ZRJPJCLcxCgIaZ3Sx9uUVtobSvHbnWAFDW8Q5OTmsRF52gKqr08uqH+LNC7V+Q== dependencies: commander "^10.0.1" diff --git a/demo/web/chat/package.json b/demo/web/chat/package.json index e2c5cee..14b2ff3 100644 --- a/demo/web/chat/package.json +++ b/demo/web/chat/package.json @@ -16,7 +16,7 @@ "author": "Picovoice Inc", "license": "Apache-2.0", "dependencies": { - "@picovoice/picollm-web": "~1.0.0" + "@picovoice/picollm-web": "~1.0.1" }, "devDependencies": { "http-server": "^14.0.0" diff --git a/demo/web/chat/yarn.lock b/demo/web/chat/yarn.lock index fe30ce6..b73809e 100644 --- a/demo/web/chat/yarn.lock +++ b/demo/web/chat/yarn.lock @@ -2,17 +2,17 @@ # yarn lockfile v1 -"@picovoice/picollm-web@~1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@picovoice/picollm-web/-/picollm-web-1.0.0.tgz#71f6e1e22939f00a6286b328c15adbf898645329" - integrity sha512-mQm6tWAIVFHINdWaxHxv3rnJr3NAkvs4b+jYQMnOgJvt29rkNwW2A4ZhyYJCPi8AKwS5XxD2GUWq86DxxnqnHw== +"@picovoice/picollm-web@~1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@picovoice/picollm-web/-/picollm-web-1.0.1.tgz#c096e4ba00b91bfacc5993c59a15b44364300f03" + integrity sha512-1aIYwKCk3lE1FmpkZcxakG2RiTecRrnpF38tgvD+/JnY2b2f+lV6f++yhBt4vJBj44gX+JQkWSnmsqGYZR8TFw== dependencies: - "@picovoice/web-utils" "~1.4.0" + "@picovoice/web-utils" "~1.4.1" -"@picovoice/web-utils@~1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@picovoice/web-utils/-/web-utils-1.4.0.tgz#ebcf5847b61311217d0db95cdd8c1721484435af" - integrity sha512-7xwnXzQEOj3a9x58RsZ77ykrmrQg6+HI8NfzHXlqqlAewunnZ7VaLEhdJVtzaM+rOzTUJOTL0bqbx2eOgHEbyw== +"@picovoice/web-utils@~1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@picovoice/web-utils/-/web-utils-1.4.1.tgz#207c5e308b1f7b9127bab83b4b3d9a653d630ffb" + integrity sha512-WoC+PAYXEpeLzq76URCX+UC5ZRJPJCLcxCgIaZ3Sx9uUVtobSvHbnWAFDW8Q5OTmsRF52gKqr08uqH+LNC7V+Q== dependencies: commander "^10.0.1" diff --git a/demo/web/completion/package.json b/demo/web/completion/package.json index b9068b6..3b77a96 100644 --- a/demo/web/completion/package.json +++ b/demo/web/completion/package.json @@ -5,7 +5,7 @@ "main": "index.js", "private": true, "scripts": { - "start": "yarn run http-server -a localhost -p 5000" + "start": "yarn run http-server -a 0.0.0.0 -p 5000" }, "keywords": [ "Picovoice", @@ -16,7 +16,7 @@ "author": "Picovoice Inc", "license": "Apache-2.0", "dependencies": { - "@picovoice/picollm-web": "~1.0.0" + "@picovoice/picollm-web": "~1.0.1" }, "devDependencies": { "http-server": "^14.0.0" diff --git a/demo/web/completion/yarn.lock b/demo/web/completion/yarn.lock index fe30ce6..b73809e 100644 --- a/demo/web/completion/yarn.lock +++ b/demo/web/completion/yarn.lock @@ -2,17 +2,17 @@ # yarn lockfile v1 -"@picovoice/picollm-web@~1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@picovoice/picollm-web/-/picollm-web-1.0.0.tgz#71f6e1e22939f00a6286b328c15adbf898645329" - integrity sha512-mQm6tWAIVFHINdWaxHxv3rnJr3NAkvs4b+jYQMnOgJvt29rkNwW2A4ZhyYJCPi8AKwS5XxD2GUWq86DxxnqnHw== +"@picovoice/picollm-web@~1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@picovoice/picollm-web/-/picollm-web-1.0.1.tgz#c096e4ba00b91bfacc5993c59a15b44364300f03" + integrity sha512-1aIYwKCk3lE1FmpkZcxakG2RiTecRrnpF38tgvD+/JnY2b2f+lV6f++yhBt4vJBj44gX+JQkWSnmsqGYZR8TFw== dependencies: - "@picovoice/web-utils" "~1.4.0" + "@picovoice/web-utils" "~1.4.1" -"@picovoice/web-utils@~1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@picovoice/web-utils/-/web-utils-1.4.0.tgz#ebcf5847b61311217d0db95cdd8c1721484435af" - integrity sha512-7xwnXzQEOj3a9x58RsZ77ykrmrQg6+HI8NfzHXlqqlAewunnZ7VaLEhdJVtzaM+rOzTUJOTL0bqbx2eOgHEbyw== +"@picovoice/web-utils@~1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@picovoice/web-utils/-/web-utils-1.4.1.tgz#207c5e308b1f7b9127bab83b4b3d9a653d630ffb" + integrity sha512-WoC+PAYXEpeLzq76URCX+UC5ZRJPJCLcxCgIaZ3Sx9uUVtobSvHbnWAFDW8Q5OTmsRF52gKqr08uqH+LNC7V+Q== dependencies: commander "^10.0.1" diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts deleted file mode 100644 index 1f90f8b..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { PvXpuType } from "../types"; -export declare enum PvPicollmFeedForwardAction { - FEED_FORWARD_SILU = 300, - FEED_FORWARD_GELU = 301, - FEED_FORWARD_ALMOST_GELU = 302, - FEED_FORWARD_MULTIPLY_BUFFERS = 303 -} -export type FeedForwardSiluType = { - n: number; - xAddress: number; -} & PvXpuType<{ - pv_picollm_feed_forward_silu: (n: number, xAddress: number) => void; -}>; -export type FeedForwardGeluType = { - n: number; - xAddress: number; -} & PvXpuType<{ - pv_picollm_feed_forward_gelu: (n: number, xAddress: number) => void; -}>; -export type FeedForwardAlmostGeluType = { - n: number; - xAddress: number; -} & PvXpuType<{ - pv_picollm_feed_forward_almost_gelu: (n: number, xAddress: number) => void; -}>; -export type FeedForwardMultiplyBuffersType = { - n: number; - xAddress: number; - yAddress: number; -} & PvXpuType<{ - pv_picollm_feed_forward_multiply_buffers: (n: number, xAddress: number, yAddress: number) => void; -}>; -//# sourceMappingURL=pv_picollm_feed_forward_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts.map deleted file mode 100644 index 4d6ad50..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_feed_forward_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,0BAA0B;IACpC,iBAAiB,MAAM;IACvB,iBAAiB,MAAA;IACjB,wBAAwB,MAAA;IACxB,6BAA6B,MAAA;CAC9B;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,4BAA4B,EAAE,CAC5B,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,4BAA4B,EAAE,CAC5B,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG;IACtC,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,mCAAmC,EAAE,CACnC,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,8BAA8B,GAAG;IAC3C,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,wCAAwC,EAAE,CACxC,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts deleted file mode 100644 index be5df4c..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { PvPicollmFeedForwardAction } from './pv_picollm_feed_forward_types'; -export declare const pvPicollmFeedForwardActionMap: Partial>; -//# sourceMappingURL=pv_picollm_feed_forward_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts.map deleted file mode 100644 index 919b760..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_feed_forward_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,0BAA0B,EAC3B,MAAM,iCAAiC,CAAC;AAyHzC,eAAO,MAAM,6BAA6B,EAAE,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,CAKvG,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts deleted file mode 100644 index e8ae8c2..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { PvXpuType } from "../types"; -export declare enum PvPicollmGateAction { - GATE_FORWARD = 400 -} -export type GateForwardType = { - n: number; - k: number; - numExperts: number; - indicesAddress: number; - weightsAddress: number; - yAddress: number; -} & PvXpuType<{ - pv_picollm_gate_forward: (n: number, k: number, numExperts: number, indicesAddress: number, weightsAddress: number, yAddress: number) => void; -}>; -//# sourceMappingURL=pv_picollm_gate_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts.map deleted file mode 100644 index fe509d9..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_gate_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,mBAAmB;IAC7B,YAAY,MAAM;CACnB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,uBAAuB,EAAE,CACvB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts deleted file mode 100644 index db5d47b..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { PvPicollmGateAction } from './pv_picollm_gate_types'; -export declare const pvPicollmGateActionMap: Partial>; -//# sourceMappingURL=pv_picollm_gate_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts.map deleted file mode 100644 index 5a34670..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_gate_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAyCjC,eAAO,MAAM,sBAAsB,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAEzF,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts deleted file mode 100644 index a89a24f..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { PvXpuType } from "../types"; -export declare enum PvPicollmMoeTransformerAction { - ADD_TO_BUFFER = 500, - MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER = 501, - ADD_BUFFERS = 502 -} -export type MoeTransformerAddToBufferType = { - n: number; - xAddress: number; - bufferAddress: number; -} & PvXpuType<{ - pv_picollm_moe_transformer_add_to_buffer: (n: number, xAddress: number, bufferAddress: number) => void; -}>; -export type MoeTransformerMultiplyWeightAndAddToBufferType = { - n: number; - weightsIndex: number; - yIndex: number; - weightsAddress: number; - xAddress: number; - yAddress: number; -} & PvXpuType<{ - pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer: (n: number, weightsIndex: number, yIndex: number, weightsAddress: number, xAddress: number, yAddress: number) => void; -}>; -export type MoeTransformerAddBuffersType = { - n: number; - buffer1Address: number; - buffer2Address: number; - yAddress: number; -} & PvXpuType<{ - pv_picollm_moe_transformer_add_buffers: (n: number, buffer1Address: number, buffer2Address: number, yAddress: number) => void; -}>; -//# sourceMappingURL=pv_picollm_moe_transformer_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts.map deleted file mode 100644 index 2feba58..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_moe_transformer_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,6BAA6B;IACvC,aAAa,MAAM;IACnB,iCAAiC,MAAA;IACjC,WAAW,MAAA;CACZ;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,SAAS,CAAC;IACZ,wCAAwC,EAAE,CACxC,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,KAClB,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,8CAA8C,GAAG;IAC3D,CAAC,EAAE,MAAM,CAAC;IACV,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,4DAA4D,EAAE,CAC5D,CAAC,EAAE,MAAM,EACT,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG;IACzC,CAAC,EAAE,MAAM,CAAC;IACV,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,sCAAsC,EAAE,CACtC,CAAC,EAAE,MAAM,EACT,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts deleted file mode 100644 index 2a0c1bd..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { PvPicollmMoeTransformerAction } from './pv_picollm_moe_transformer_types'; -export declare const pvPicollmMoeTransformerActionMap: Partial>; -//# sourceMappingURL=pv_picollm_moe_transformer_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts.map deleted file mode 100644 index ccae345..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_moe_transformer_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,6BAA6B,EAC9B,MAAM,oCAAoC,CAAC;AA4G5C,eAAO,MAAM,gCAAgC,EAAE,OAAO,CAAC,MAAM,CAAC,6BAA6B,EAAE,gBAAgB,CAAC,CAI7G,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts deleted file mode 100644 index 5c72edd..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { PvXpuType } from "../types"; -export declare enum PvPicollmNormAction { - NORM_FORWARD = 600 -} -export type NormForwardType = { - dimension: number; - eps: number; - weightAddress: number; - n: number; - xOffset: number; - xAddress: number; - yOffset: number; - yAddress: number; -} & PvXpuType<{ - pv_picollm_norm_forward: (dimension: number, eps: number, weightAddress: number, n: number, xAddress: number, yAddress: number) => void; -}>; -//# sourceMappingURL=pv_picollm_norm_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts.map deleted file mode 100644 index a5b4e6a..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_norm_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,mBAAmB;IAC7B,YAAY,MAAM;CACnB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,uBAAuB,EAAE,CACvB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts deleted file mode 100644 index 6899300..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { PvPicollmNormAction } from './pv_picollm_norm_types'; -export declare const pvPicollmNormActionMap: Partial>; -//# sourceMappingURL=pv_picollm_norm_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts.map deleted file mode 100644 index 7eb68d2..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_norm_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AA2CjC,eAAO,MAAM,sBAAsB,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAEzF,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts deleted file mode 100644 index 87eccab..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { PvXpuType } from "../types"; -export declare enum PvPicollmNormLayerAction { - NORM_LAYER_FORWARD = 800 -} -export type NormLayerForwardType = { - dimension: number; - eps: number; - weightAddress: number; - biasAddress: number; - n: number; - xOffset: number; - xAddress: number; - yOffset: number; - yAddress: number; -} & PvXpuType<{ - pv_picollm_norm_layer_forward: (dimension: number, eps: number, weightAddress: number, biasAddress: number, n: number, xAddress: number, yAddress: number) => void; -}>; -//# sourceMappingURL=pv_picollm_norm_layer_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts.map deleted file mode 100644 index ec5971f..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_norm_layer_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,wBAAwB;IAClC,kBAAkB,MAAM;CACzB;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,6BAA6B,EAAE,CAC7B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts deleted file mode 100644 index cba33da..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { PvPicollmNormLayerAction } from './pv_picollm_norm_layer_types'; -export declare const pvPicollmNormLayerActionMap: Partial>; -//# sourceMappingURL=pv_picollm_norm_layer_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts.map deleted file mode 100644 index 1e84c38..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_norm_layer_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,wBAAwB,EACzB,MAAM,+BAA+B,CAAC;AA8CvC,eAAO,MAAM,2BAA2B,EAAE,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CAEnG,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts deleted file mode 100644 index 19aa8a6..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { PvXpuType } from "../types"; -export declare enum PvPicollmTransformerAction { - ADD_TO_BUFFER = 700, - ADD_BUFFERS = 701 -} -export type TransformerAddToBufferType = { - n: number; - xAddress: number; - bufferAddress: number; -} & PvXpuType<{ - pv_picollm_transformer_add_to_buffer: (n: number, xAddress: number, bufferAddress: number) => void; -}>; -export type TransformerAddBuffersType = { - n: number; - buffer1Address: number; - buffer2Address: number; - yAddress: number; -} & PvXpuType<{ - pv_picollm_transformer_add_buffers: (n: number, buffer1Address: number, buffer2Address: number, yAddress: number) => void; -}>; -//# sourceMappingURL=pv_picollm_transformer_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts.map deleted file mode 100644 index 38036b0..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_transformer_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,0BAA0B;IACpC,aAAa,MAAM;IACnB,WAAW,MAAA;CACZ;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,SAAS,CAAC;IACZ,oCAAoC,EAAE,CACpC,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,KAClB,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG;IACtC,CAAC,EAAE,MAAM,CAAC;IACV,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,kCAAkC,EAAE,CAClC,CAAC,EAAE,MAAM,EACT,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts deleted file mode 100644 index 93b3be8..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { PvPicollmTransformerAction } from './pv_picollm_transformer_types'; -export declare const pvPicollmTransformerActionMap: Partial>; -//# sourceMappingURL=pv_picollm_transformer_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts.map deleted file mode 100644 index f330db8..0000000 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pv_picollm_transformer_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,0BAA0B,EAC3B,MAAM,gCAAgC,CAAC;AAqExC,eAAO,MAAM,6BAA6B,EAAE,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,CAGvG,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.d.ts.map index 912b4d1..4957e61 100644 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.d.ts.map +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"pv_picollm_weight.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAyBtC,eAAO,MAAM,6BAA6B,WAAY,YAAY,MAAM,SAAS,OAAO,YAAY,GAAG;uFASvF,MAAM,eACL,MAAM,gBACL,MAAM,gBACN,MAAM,oBACF,MAAM,yBACD,MAAM,aAClB,MAAM,iBACF,MAAM,iBACN,MAAM,oBACH,MAAM,iBACT,MAAM;sFAmHT,MAAM,gBACJ,MAAM,gBACN,MAAM,yBACG,MAAM,oBACX,MAAM,aACb,MAAM,YACP,MAAM,gBACF,MAAM,mBACH,MAAM,iBACR,MAAM;qFAgFT,MAAM,gBACJ,MAAM,oBACF,MAAM,aACb,MAAM,eACJ,MAAM,kBACH,MAAM,iBACP,MAAM;;;;CA0TxB,CAAC"} \ No newline at end of file +{"version":3,"file":"pv_picollm_weight.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAyBtC,eAAO,MAAM,6BAA6B,WAAY,YAAY,MAAM,SAAS,OAAO,YAAY,GAAG;uFASvF,MAAM,eACL,MAAM,gBACL,MAAM,gBACN,MAAM,oBACF,MAAM,yBACD,MAAM,aAClB,MAAM,iBACF,MAAM,iBACN,MAAM,oBACH,MAAM,iBACT,MAAM;sFAmHT,MAAM,gBACJ,MAAM,gBACN,MAAM,yBACG,MAAM,oBACX,MAAM,aACb,MAAM,YACP,MAAM,gBACF,MAAM,mBACH,MAAM,iBACR,MAAM;qFAkFT,MAAM,gBACJ,MAAM,oBACF,MAAM,aACb,MAAM,eACJ,MAAM,kBACH,MAAM,iBACP,MAAM;;;;CA4TxB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts.map index abb0680..f9109ed 100644 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts.map +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"pv_xpu.d.ts","sourceRoot":"","sources":["../../../../src/xpu_web_worker/src/pv_xpu.ts"],"names":[],"mappings":"AA4BA,QAAA,MAAM,OAAO,WACH,YAAY,MAAM,kBACV,UAAU;;+BAikBG,MAAM,QAAQ,MAAM,KAAG,QAAQ,MAAM,CAAC;oBAGjD,MAAM,KAAG,QAAQ,IAAI,CAAC;2CAGC,MAAM,aAAa,MAAM,YAAY,MAAM,YAAY,MAAM,KAAG,QAAQ,IAAI,CAAC;;;;oEA5jBzF,MAAM,gCACH,MAAM,wBACd,MAAM,mBACX,MAAM,iBACR,MAAM,KAAG,QAAQ,IAAI,CAAC;qDAoEI,MAAM,cAAc,MAAM,iBAAiB,MAAM,KAAG,QAAQ,IAAI,CAAC;wDAyCpE,MAAM;;;;;;;gEA6UW,MAAM,KAAG,QAAQ,IAAI,CAAC;qDAQjE,MAAM;oDAqBN,MAAM;qDAoBN,MAAM;oDAaN,MAAM;uDAaN,MAAM,iBACH,MAAM;;CAiGxB,CAAC;AAEF,OAAO,EACL,OAAO,GACR,CAAC"} \ No newline at end of file +{"version":3,"file":"pv_xpu.d.ts","sourceRoot":"","sources":["../../../../src/xpu_web_worker/src/pv_xpu.ts"],"names":[],"mappings":"AA4BA,QAAA,MAAM,OAAO,WACH,YAAY,MAAM,kBACV,UAAU;;+BAskBG,MAAM,QAAQ,MAAM,KAAG,QAAQ,MAAM,CAAC;oBAGjD,MAAM,KAAG,QAAQ,IAAI,CAAC;2CAGC,MAAM,aAAa,MAAM,YAAY,MAAM,YAAY,MAAM,KAAG,QAAQ,IAAI,CAAC;;;;oEAjkBzF,MAAM,gCACH,MAAM,wBACd,MAAM,mBACX,MAAM,iBACR,MAAM,KAAG,QAAQ,IAAI,CAAC;qDAoEI,MAAM,cAAc,MAAM,iBAAiB,MAAM,KAAG,QAAQ,IAAI,CAAC;wDAyCpE,MAAM;;;;;;;gEA6UW,MAAM,KAAG,QAAQ,IAAI,CAAC;qDAQjE,MAAM;oDAqBN,MAAM;qDAoBN,MAAM;oDAaN,MAAM;uDAaN,MAAM,iBACH,MAAM;;CAsGxB,CAAC;AAEF,OAAO,EACL,OAAO,GACR,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/xpu_web_worker/esm/index.js b/lib/wasm/dist/xpu_web_worker/esm/index.js index a8a3d1b..ee0187f 100644 --- a/lib/wasm/dist/xpu_web_worker/esm/index.js +++ b/lib/wasm/dist/xpu_web_worker/esm/index.js @@ -3083,12 +3083,6 @@ try { } } -function _classCallCheck$1(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - function _typeof(o) { "@babel/helpers - typeof"; @@ -3099,6 +3093,12 @@ function _typeof(o) { }, _typeof(o); } +function _classCallCheck$1(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; @@ -3165,6 +3165,11 @@ var PvFile = /*#__PURE__*/function () { version: 0 }, this._meta); } + }, { + key: "pageSize", + get: function get() { + return undefined; + } /** * Get the file pointer from the _filePtrs map. * @param ptr The pointer to BasePvFile instance to get from the map. @@ -3258,7 +3263,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) { }; } -var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gX3R5cGVvZiQzKG8pIHsKICAgICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7CgogICAgcmV0dXJuIF90eXBlb2YkMyA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsKICAgICAgcmV0dXJuIHR5cGVvZiBvOwogICAgfSA6IGZ1bmN0aW9uIChvKSB7CiAgICAgIHJldHVybiBvICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG87CiAgICB9LCBfdHlwZW9mJDMobyk7CiAgfQoKICBmdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7CiAgICBpZiAoIm9iamVjdCIgIT0gX3R5cGVvZiQzKHQpIHx8ICF0KSByZXR1cm4gdDsKICAgIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOwogICAgaWYgKHZvaWQgMCAhPT0gZSkgewogICAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8ICJkZWZhdWx0Iik7CiAgICAgIGlmICgib2JqZWN0IiAhPSBfdHlwZW9mJDMoaSkpIHJldHVybiBpOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogICAgfQogICAgcmV0dXJuICgic3RyaW5nIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7CiAgfQoKICBmdW5jdGlvbiB0b1Byb3BlcnR5S2V5KHQpIHsKICAgIHZhciBpID0gdG9QcmltaXRpdmUodCwgInN0cmluZyIpOwogICAgcmV0dXJuICJzeW1ib2wiID09IF90eXBlb2YkMyhpKSA/IGkgOiBTdHJpbmcoaSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7CiAgICBrZXkgPSB0b1Byb3BlcnR5S2V5KGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsKICAgIHRyeSB7CiAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsKICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHJlamVjdChlcnJvcik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpbmZvLmRvbmUpIHsKICAgICAgcmVzb2x2ZSh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgYXJncyA9IGFyZ3VtZW50czsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsKICAgICAgICB9CiAgICAgICAgX25leHQodW5kZWZpbmVkKTsKICAgICAgfSk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMkMSAoeCkgewogIAlyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4OwogIH0KCiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQyID0ge2V4cG9ydHM6IHt9fTsKCiAgdmFyIF90eXBlb2YkMiA9IHtleHBvcnRzOiB7fX07CgogIF90eXBlb2YkMi5leHBvcnRzOwoKICAoZnVuY3Rpb24gKG1vZHVsZSkgewogIAlmdW5jdGlvbiBfdHlwZW9mKG8pIHsKICAJICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAJICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsKICAJICAgIHJldHVybiB0eXBlb2YgbzsKICAJICB9IDogZnVuY3Rpb24gKG8pIHsKICAJICAgIHJldHVybiBvICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG87CiAgCSAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0cyksIF90eXBlb2Yobyk7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChfdHlwZW9mJDIpKTsKCiAgdmFyIF90eXBlb2ZFeHBvcnRzJDEgPSBfdHlwZW9mJDIuZXhwb3J0czsKCiAgcmVnZW5lcmF0b3JSdW50aW1lJDIuZXhwb3J0czsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJdmFyIF90eXBlb2YgPSBfdHlwZW9mRXhwb3J0cyQxWyJkZWZhdWx0Il07CiAgCWZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAJICAgIHJldHVybiBlOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgCSAgdmFyIHQsCiAgCSAgICBlID0ge30sCiAgCSAgICByID0gT2JqZWN0LnByb3RvdHlwZSwKICAJICAgIG4gPSByLmhhc093blByb3BlcnR5LAogIAkgICAgbyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAodCwgZSwgcikgewogIAkgICAgICB0W2VdID0gci52YWx1ZTsKICAJICAgIH0sCiAgCSAgICBpID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sID8gU3ltYm9sIDoge30sCiAgCSAgICBhID0gaS5pdGVyYXRvciB8fCAiQEBpdGVyYXRvciIsCiAgCSAgICBjID0gaS5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogIAkgICAgdSA9IGkudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZSh0LCBlLCByKSB7CiAgCSAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIHsKICAJICAgICAgdmFsdWU6IHIsCiAgCSAgICAgIGVudW1lcmFibGU6ICEwLAogIAkgICAgICBjb25maWd1cmFibGU6ICEwLAogIAkgICAgICB3cml0YWJsZTogITAKICAJICAgIH0pLCB0W2VdOwogIAkgIH0KICAJICB0cnkgewogIAkgICAgZGVmaW5lKHt9LCAiIik7CiAgCSAgfSBjYXRjaCAodCkgewogIAkgICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHQsIGUsIHIpIHsKICAJICAgICAgcmV0dXJuIHRbZV0gPSByOwogIAkgICAgfTsKICAJICB9CiAgCSAgZnVuY3Rpb24gd3JhcCh0LCBlLCByLCBuKSB7CiAgCSAgICB2YXIgaSA9IGUgJiYgZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBlIDogR2VuZXJhdG9yLAogIAkgICAgICBhID0gT2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSksCiAgCSAgICAgIGMgPSBuZXcgQ29udGV4dChuIHx8IFtdKTsKICAJICAgIHJldHVybiBvKGEsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZCh0LCByLCBjKQogIAkgICAgfSksIGE7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHRyeUNhdGNoKHQsIGUsIHIpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiB0LmNhbGwoZSwgcikKICAJICAgICAgfTsKICAJICAgIH0gY2F0Y2ggKHQpIHsKICAJICAgICAgcmV0dXJuIHsKICAJICAgICAgICB0eXBlOiAidGhyb3ciLAogIAkgICAgICAgIGFyZzogdAogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBlLndyYXAgPSB3cmFwOwogIAkgIHZhciBoID0gInN1c3BlbmRlZFN0YXJ0IiwKICAJICAgIGwgPSAic3VzcGVuZGVkWWllbGQiLAogIAkgICAgZiA9ICJleGVjdXRpbmciLAogIAkgICAgcyA9ICJjb21wbGV0ZWQiLAogIAkgICAgeSA9IHt9OwogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fQogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAJICB2YXIgcCA9IHt9OwogIAkgIGRlZmluZShwLCBhLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KTsKICAJICB2YXIgZCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIHYgPSBkICYmIGQoZCh2YWx1ZXMoW10pKSk7CiAgCSAgdiAmJiB2ICE9PSByICYmIG4uY2FsbCh2LCBhKSAmJiAocCA9IHYpOwogIAkgIHZhciBnID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocCk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHQpIHsKICAJICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgCSAgICAgIGRlZmluZSh0LCBlLCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UoZSwgdCk7CiAgCSAgICAgIH0pOwogIAkgICAgfSk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IodCwgZSkgewogIAkgICAgZnVuY3Rpb24gaW52b2tlKHIsIG8sIGksIGEpIHsKICAJICAgICAgdmFyIGMgPSB0cnlDYXRjaCh0W3JdLCB0LCBvKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IGMudHlwZSkgewogIAkgICAgICAgIHZhciB1ID0gYy5hcmcsCiAgCSAgICAgICAgICBoID0gdS52YWx1ZTsKICAJICAgICAgICByZXR1cm4gaCAmJiAib2JqZWN0IiA9PSBfdHlwZW9mKGgpICYmIG4uY2FsbChoLCAiX19hd2FpdCIpID8gZS5yZXNvbHZlKGguX19hd2FpdCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgaW52b2tlKCJuZXh0IiwgdCwgaSwgYSk7CiAgCSAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHsKICAJICAgICAgICAgIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KSA6IGUucmVzb2x2ZShoKS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgCSAgICAgICAgICB1LnZhbHVlID0gdCwgaSh1KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KTsKICAJICAgICAgfQogIAkgICAgICBhKGMuYXJnKTsKICAJICAgIH0KICAJICAgIHZhciByOwogIAkgICAgbyh0aGlzLCAiX2ludm9rZSIsIHsKICAJICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHQsIG4pIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSwgcikgewogIAkgICAgICAgICAgICBpbnZva2UodCwgbiwgZSwgcik7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHIgPSByID8gci50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChlLCByLCBuKSB7CiAgCSAgICB2YXIgbyA9IGg7CiAgCSAgICByZXR1cm4gZnVuY3Rpb24gKGksIGEpIHsKICAJICAgICAgaWYgKG8gPT09IGYpIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogIAkgICAgICBpZiAobyA9PT0gcykgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBpKSB0aHJvdyBhOwogIAkgICAgICAgIHJldHVybiB7CiAgCSAgICAgICAgICB2YWx1ZTogdCwKICAJICAgICAgICAgIGRvbmU6ICEwCiAgCSAgICAgICAgfTsKICAJICAgICAgfQogIAkgICAgICBmb3IgKG4ubWV0aG9kID0gaSwgbi5hcmcgPSBhOzspIHsKICAJICAgICAgICB2YXIgYyA9IG4uZGVsZWdhdGU7CiAgCSAgICAgICAgaWYgKGMpIHsKICAJICAgICAgICAgIHZhciB1ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShjLCBuKTsKICAJICAgICAgICAgIGlmICh1KSB7CiAgCSAgICAgICAgICAgIGlmICh1ID09PSB5KSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIHU7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICAgIGlmICgibmV4dCIgPT09IG4ubWV0aG9kKSBuLnNlbnQgPSBuLl9zZW50ID0gbi5hcmc7ZWxzZSBpZiAoInRocm93IiA9PT0gbi5tZXRob2QpIHsKICAJICAgICAgICAgIGlmIChvID09PSBoKSB0aHJvdyBvID0gcywgbi5hcmc7CiAgCSAgICAgICAgICBuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKTsKICAJICAgICAgICB9IGVsc2UgInJldHVybiIgPT09IG4ubWV0aG9kICYmIG4uYWJydXB0KCJyZXR1cm4iLCBuLmFyZyk7CiAgCSAgICAgICAgbyA9IGY7CiAgCSAgICAgICAgdmFyIHAgPSB0cnlDYXRjaChlLCByLCBuKTsKICAJICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHAudHlwZSkgewogIAkgICAgICAgICAgaWYgKG8gPSBuLmRvbmUgPyBzIDogbCwgcC5hcmcgPT09IHkpIGNvbnRpbnVlOwogIAkgICAgICAgICAgcmV0dXJuIHsKICAJICAgICAgICAgICAgdmFsdWU6IHAuYXJnLAogIAkgICAgICAgICAgICBkb25lOiBuLmRvbmUKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgfQogIAkgICAgICAgICJ0aHJvdyIgPT09IHAudHlwZSAmJiAobyA9IHMsIG4ubWV0aG9kID0gInRocm93Iiwgbi5hcmcgPSBwLmFyZyk7CiAgCSAgICAgIH0KICAJICAgIH07CiAgCSAgfQogIAkgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgcikgewogIAkgICAgdmFyIG4gPSByLm1ldGhvZCwKICAJICAgICAgbyA9IGUuaXRlcmF0b3Jbbl07CiAgCSAgICBpZiAobyA9PT0gdCkgcmV0dXJuIHIuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBuICYmIGUuaXRlcmF0b3JbInJldHVybiJdICYmIChyLm1ldGhvZCA9ICJyZXR1cm4iLCByLmFyZyA9IHQsIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgciksICJ0aHJvdyIgPT09IHIubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbiAmJiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBuICsgIicgbWV0aG9kIikpLCB5OwogIAkgICAgdmFyIGkgPSB0cnlDYXRjaChvLCBlLml0ZXJhdG9yLCByLmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gaS50eXBlKSByZXR1cm4gci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IGkuYXJnLCByLmRlbGVnYXRlID0gbnVsbCwgeTsKICAJICAgIHZhciBhID0gaS5hcmc7CiAgCSAgICByZXR1cm4gYSA/IGEuZG9uZSA/IChyW2UucmVzdWx0TmFtZV0gPSBhLnZhbHVlLCByLm5leHQgPSBlLm5leHRMb2MsICJyZXR1cm4iICE9PSByLm1ldGhvZCAmJiAoci5tZXRob2QgPSAibmV4dCIsIHIuYXJnID0gdCksIHIuZGVsZWdhdGUgPSBudWxsLCB5KSA6IGEgOiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksIHIuZGVsZWdhdGUgPSBudWxsLCB5KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gewogIAkgICAgICB0cnlMb2M6IHRbMF0KICAJICAgIH07CiAgCSAgICAxIGluIHQgJiYgKGUuY2F0Y2hMb2MgPSB0WzFdKSwgMiBpbiB0ICYmIChlLmZpbmFsbHlMb2MgPSB0WzJdLCBlLmFmdGVyTG9jID0gdFszXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGUpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gdC5jb21wbGV0aW9uIHx8IHt9OwogIAkgICAgZS50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSBlLmFyZywgdC5jb21wbGV0aW9uID0gZTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQ29udGV4dCh0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHQuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsKICAJICB9CiAgCSAgZnVuY3Rpb24gdmFsdWVzKGUpIHsKICAJICAgIGlmIChlIHx8ICIiID09PSBlKSB7CiAgCSAgICAgIHZhciByID0gZVthXTsKICAJICAgICAgaWYgKHIpIHJldHVybiByLmNhbGwoZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBlLm5leHQpIHJldHVybiBlOwogIAkgICAgICBpZiAoIWlzTmFOKGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBvID0gLTEsCiAgCSAgICAgICAgICBpID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsrbyA8IGUubGVuZ3RoOykgaWYgKG4uY2FsbChlLCBvKSkgcmV0dXJuIG5leHQudmFsdWUgPSBlW29dLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgcmV0dXJuIGkubmV4dCA9IGk7CiAgCSAgICAgIH0KICAJICAgIH0KICAJICAgIHRocm93IG5ldyBUeXBlRXJyb3IoX3R5cGVvZihlKSArICIgaXMgbm90IGl0ZXJhYmxlIik7CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgbyhnLCAiY29uc3RydWN0b3IiLCB7CiAgCSAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgCSAgICBjb25maWd1cmFibGU6ICEwCiAgCSAgfSksIG8oR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBlLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAodCkgewogIAkgICAgdmFyIGUgPSAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmIHQuY29uc3RydWN0b3I7CiAgCSAgICByZXR1cm4gISFlICYmIChlID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAiR2VuZXJhdG9yRnVuY3Rpb24iID09PSAoZS5kaXNwbGF5TmFtZSB8fCBlLm5hbWUpKTsKICAJICB9LCBlLm1hcmsgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZih0LCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAodC5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKHQsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpKSwgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGcpLCB0OwogIAkgIH0sIGUuYXdyYXAgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgX19hd2FpdDogdAogIAkgICAgfTsKICAJICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGMsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pLCBlLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBlLmFzeW5jID0gZnVuY3Rpb24gKHQsIHIsIG4sIG8sIGkpIHsKICAJICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFByb21pc2UpOwogIAkgICAgdmFyIGEgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKHQsIHIsIG4sIG8pLCBpKTsKICAJICAgIHJldHVybiBlLmlzR2VuZXJhdG9yRnVuY3Rpb24ocikgPyBhIDogYS5uZXh0KCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICByZXR1cm4gdC5kb25lID8gdC52YWx1ZSA6IGEubmV4dCgpOwogIAkgICAgfSk7CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKGcpLCBkZWZpbmUoZywgdSwgIkdlbmVyYXRvciIpLCBkZWZpbmUoZywgYSwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShnLCAidG9TdHJpbmciLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgCSAgfSksIGUua2V5cyA9IGZ1bmN0aW9uICh0KSB7CiAgCSAgICB2YXIgZSA9IE9iamVjdCh0KSwKICAJICAgICAgciA9IFtdOwogIAkgICAgZm9yICh2YXIgbiBpbiBlKSByLnB1c2gobik7CiAgCSAgICByZXR1cm4gci5yZXZlcnNlKCksIGZ1bmN0aW9uIG5leHQoKSB7CiAgCSAgICAgIGZvciAoOyByLmxlbmd0aDspIHsKICAJICAgICAgICB2YXIgdCA9IHIucG9wKCk7CiAgCSAgICAgICAgaWYgKHQgaW4gZSkgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGUudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KGUpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB0LCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gIm5leHQiLCB0aGlzLmFyZyA9IHQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhZSkgZm9yICh2YXIgciBpbiB0aGlzKSAidCIgPT09IHIuY2hhckF0KDApICYmIG4uY2FsbCh0aGlzLCByKSAmJiAhaXNOYU4oK3Iuc2xpY2UoMSkpICYmICh0aGlzW3JdID0gdCk7CiAgCSAgICB9LAogIAkgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAJICAgICAgdGhpcy5kb25lID0gITA7CiAgCSAgICAgIHZhciB0ID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gdGhpcy5ydmFsOwogIAkgICAgfSwKICAJICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihlKSB7CiAgCSAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGU7CiAgCSAgICAgIHZhciByID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKG4sIG8pIHsKICAJICAgICAgICByZXR1cm4gYS50eXBlID0gInRocm93IiwgYS5hcmcgPSBlLCByLm5leHQgPSBuLCBvICYmIChyLm1ldGhvZCA9ICJuZXh0Iiwgci5hcmcgPSB0KSwgISFvOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIG8gPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgbyA+PSAwOyAtLW8pIHsKICAJICAgICAgICB2YXIgaSA9IHRoaXMudHJ5RW50cmllc1tvXSwKICAJICAgICAgICAgIGEgPSBpLmNvbXBsZXRpb247CiAgCSAgICAgICAgaWYgKCJyb290IiA9PT0gaS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogIAkgICAgICAgIGlmIChpLnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBjID0gbi5jYWxsKGksICJjYXRjaExvYyIpLAogIAkgICAgICAgICAgICB1ID0gbi5jYWxsKGksICJmaW5hbGx5TG9jIik7CiAgCSAgICAgICAgICBpZiAoYyAmJiB1KSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShpLmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChjKSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghdSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgaS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGkuZmluYWxseUxvYyk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICB9CiAgCSAgICB9LAogIAkgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodCwgZSkgewogIAkgICAgICBmb3IgKHZhciByID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHIgPj0gMDsgLS1yKSB7CiAgCSAgICAgICAgdmFyIG8gPSB0aGlzLnRyeUVudHJpZXNbcl07CiAgCSAgICAgICAgaWYgKG8udHJ5TG9jIDw9IHRoaXMucHJldiAmJiBuLmNhbGwobywgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBvLmZpbmFsbHlMb2MpIHsKICAJICAgICAgICAgIHZhciBpID0gbzsKICAJICAgICAgICAgIGJyZWFrOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICBpICYmICgiYnJlYWsiID09PSB0IHx8ICJjb250aW51ZSIgPT09IHQpICYmIGkudHJ5TG9jIDw9IGUgJiYgZSA8PSBpLmZpbmFsbHlMb2MgJiYgKGkgPSBudWxsKTsKICAJICAgICAgdmFyIGEgPSBpID8gaS5jb21wbGV0aW9uIDoge307CiAgCSAgICAgIHJldHVybiBhLnR5cGUgPSB0LCBhLmFyZyA9IGUsIGkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGkuZmluYWxseUxvYywgeSkgOiB0aGlzLmNvbXBsZXRlKGEpOwogIAkgICAgfSwKICAJICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSh0LCBlKSB7CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gImJyZWFrIiA9PT0gdC50eXBlIHx8ICJjb250aW51ZSIgPT09IHQudHlwZSA/IHRoaXMubmV4dCA9IHQuYXJnIDogInJldHVybiIgPT09IHQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gdC50eXBlICYmIGUgJiYgKHRoaXMubmV4dCA9IGUpLCB5OwogIAkgICAgfSwKICAJICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKHQpIHsKICAJICAgICAgZm9yICh2YXIgZSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBlID49IDA7IC0tZSkgewogIAkgICAgICAgIHZhciByID0gdGhpcy50cnlFbnRyaWVzW2VdOwogIAkgICAgICAgIGlmIChyLmZpbmFsbHlMb2MgPT09IHQpIHJldHVybiB0aGlzLmNvbXBsZXRlKHIuY29tcGxldGlvbiwgci5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkociksIHk7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godCkgewogIAkgICAgICBmb3IgKHZhciBlID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGUgPj0gMDsgLS1lKSB7CiAgCSAgICAgICAgdmFyIHIgPSB0aGlzLnRyeUVudHJpZXNbZV07CiAgCSAgICAgICAgaWYgKHIudHJ5TG9jID09PSB0KSB7CiAgCSAgICAgICAgICB2YXIgbiA9IHIuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSBuLnR5cGUpIHsKICAJICAgICAgICAgICAgdmFyIG8gPSBuLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShyKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICAgIHJldHVybiBvOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoZSwgciwgbikgewogIAkgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAJICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGUpLAogIAkgICAgICAgIHJlc3VsdE5hbWU6IHIsCiAgCSAgICAgICAgbmV4dExvYzogbgogIAkgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHQpLCB5OwogIAkgICAgfQogIAkgIH0sIGU7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMikpOwoKICB2YXIgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyQxID0gcmVnZW5lcmF0b3JSdW50aW1lJDIuZXhwb3J0czsKCiAgLy8gVE9ETyhCYWJlbCA4KTogUmVtb3ZlIHRoaXMgZmlsZS4KCiAgdmFyIHJ1bnRpbWUkMSA9IHJlZ2VuZXJhdG9yUnVudGltZUV4cG9ydHMkMSgpOwogIHZhciByZWdlbmVyYXRvciQxID0gcnVudGltZSQxOwoKICAvLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUvcnVudGltZS5qcyNMNzM2PQogIHRyeSB7CiAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgICB9IGVsc2UgewogICAgICBGdW5jdGlvbigiciIsICJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocnVudGltZSQxKTsKICAgIH0KICB9CgogIHZhciBfcmVnZW5lcmF0b3JSdW50aW1lJDEgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMkMShyZWdlbmVyYXRvciQxKTsKCiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHsKICAJcmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDsKICB9CgogIHZhciByZWdlbmVyYXRvclJ1bnRpbWUkMSA9IHtleHBvcnRzOiB7fX07CgogIHZhciBfdHlwZW9mJDEgPSB7ZXhwb3J0czoge319OwoKICBfdHlwZW9mJDEuZXhwb3J0czsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJZnVuY3Rpb24gX3R5cGVvZihvKSB7CiAgCSAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgCSAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgInN5bWJvbCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7CiAgCSAgICByZXR1cm4gdHlwZW9mIG87CiAgCSAgfSA6IGZ1bmN0aW9uIChvKSB7CiAgCSAgICByZXR1cm4gbyAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHMpLCBfdHlwZW9mKG8pOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsgCiAgfSAoX3R5cGVvZiQxKSk7CgogIHZhciBfdHlwZW9mRXhwb3J0cyA9IF90eXBlb2YkMS5leHBvcnRzOwoKICByZWdlbmVyYXRvclJ1bnRpbWUkMS5leHBvcnRzOwoKICAoZnVuY3Rpb24gKG1vZHVsZSkgewogIAl2YXIgX3R5cGVvZiA9IF90eXBlb2ZFeHBvcnRzWyJkZWZhdWx0Il07CiAgCWZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAJICAgIHJldHVybiBlOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgCSAgdmFyIHQsCiAgCSAgICBlID0ge30sCiAgCSAgICByID0gT2JqZWN0LnByb3RvdHlwZSwKICAJICAgIG4gPSByLmhhc093blByb3BlcnR5LAogIAkgICAgbyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAodCwgZSwgcikgewogIAkgICAgICB0W2VdID0gci52YWx1ZTsKICAJICAgIH0sCiAgCSAgICBpID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sID8gU3ltYm9sIDoge30sCiAgCSAgICBhID0gaS5pdGVyYXRvciB8fCAiQEBpdGVyYXRvciIsCiAgCSAgICBjID0gaS5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogIAkgICAgdSA9IGkudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZSh0LCBlLCByKSB7CiAgCSAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIHsKICAJICAgICAgdmFsdWU6IHIsCiAgCSAgICAgIGVudW1lcmFibGU6ICEwLAogIAkgICAgICBjb25maWd1cmFibGU6ICEwLAogIAkgICAgICB3cml0YWJsZTogITAKICAJICAgIH0pLCB0W2VdOwogIAkgIH0KICAJICB0cnkgewogIAkgICAgZGVmaW5lKHt9LCAiIik7CiAgCSAgfSBjYXRjaCAodCkgewogIAkgICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHQsIGUsIHIpIHsKICAJICAgICAgcmV0dXJuIHRbZV0gPSByOwogIAkgICAgfTsKICAJICB9CiAgCSAgZnVuY3Rpb24gd3JhcCh0LCBlLCByLCBuKSB7CiAgCSAgICB2YXIgaSA9IGUgJiYgZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBlIDogR2VuZXJhdG9yLAogIAkgICAgICBhID0gT2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSksCiAgCSAgICAgIGMgPSBuZXcgQ29udGV4dChuIHx8IFtdKTsKICAJICAgIHJldHVybiBvKGEsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZCh0LCByLCBjKQogIAkgICAgfSksIGE7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHRyeUNhdGNoKHQsIGUsIHIpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiB0LmNhbGwoZSwgcikKICAJICAgICAgfTsKICAJICAgIH0gY2F0Y2ggKHQpIHsKICAJICAgICAgcmV0dXJuIHsKICAJICAgICAgICB0eXBlOiAidGhyb3ciLAogIAkgICAgICAgIGFyZzogdAogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBlLndyYXAgPSB3cmFwOwogIAkgIHZhciBoID0gInN1c3BlbmRlZFN0YXJ0IiwKICAJICAgIGwgPSAic3VzcGVuZGVkWWllbGQiLAogIAkgICAgZiA9ICJleGVjdXRpbmciLAogIAkgICAgcyA9ICJjb21wbGV0ZWQiLAogIAkgICAgeSA9IHt9OwogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fQogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAJICB2YXIgcCA9IHt9OwogIAkgIGRlZmluZShwLCBhLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KTsKICAJICB2YXIgZCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIHYgPSBkICYmIGQoZCh2YWx1ZXMoW10pKSk7CiAgCSAgdiAmJiB2ICE9PSByICYmIG4uY2FsbCh2LCBhKSAmJiAocCA9IHYpOwogIAkgIHZhciBnID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocCk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHQpIHsKICAJICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgCSAgICAgIGRlZmluZSh0LCBlLCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UoZSwgdCk7CiAgCSAgICAgIH0pOwogIAkgICAgfSk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IodCwgZSkgewogIAkgICAgZnVuY3Rpb24gaW52b2tlKHIsIG8sIGksIGEpIHsKICAJICAgICAgdmFyIGMgPSB0cnlDYXRjaCh0W3JdLCB0LCBvKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IGMudHlwZSkgewogIAkgICAgICAgIHZhciB1ID0gYy5hcmcsCiAgCSAgICAgICAgICBoID0gdS52YWx1ZTsKICAJICAgICAgICByZXR1cm4gaCAmJiAib2JqZWN0IiA9PSBfdHlwZW9mKGgpICYmIG4uY2FsbChoLCAiX19hd2FpdCIpID8gZS5yZXNvbHZlKGguX19hd2FpdCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgaW52b2tlKCJuZXh0IiwgdCwgaSwgYSk7CiAgCSAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHsKICAJICAgICAgICAgIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KSA6IGUucmVzb2x2ZShoKS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgCSAgICAgICAgICB1LnZhbHVlID0gdCwgaSh1KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KTsKICAJICAgICAgfQogIAkgICAgICBhKGMuYXJnKTsKICAJICAgIH0KICAJICAgIHZhciByOwogIAkgICAgbyh0aGlzLCAiX2ludm9rZSIsIHsKICAJICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHQsIG4pIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSwgcikgewogIAkgICAgICAgICAgICBpbnZva2UodCwgbiwgZSwgcik7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHIgPSByID8gci50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChlLCByLCBuKSB7CiAgCSAgICB2YXIgbyA9IGg7CiAgCSAgICByZXR1cm4gZnVuY3Rpb24gKGksIGEpIHsKICAJICAgICAgaWYgKG8gPT09IGYpIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogIAkgICAgICBpZiAobyA9PT0gcykgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBpKSB0aHJvdyBhOwogIAkgICAgICAgIHJldHVybiB7CiAgCSAgICAgICAgICB2YWx1ZTogdCwKICAJICAgICAgICAgIGRvbmU6ICEwCiAgCSAgICAgICAgfTsKICAJICAgICAgfQogIAkgICAgICBmb3IgKG4ubWV0aG9kID0gaSwgbi5hcmcgPSBhOzspIHsKICAJICAgICAgICB2YXIgYyA9IG4uZGVsZWdhdGU7CiAgCSAgICAgICAgaWYgKGMpIHsKICAJICAgICAgICAgIHZhciB1ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShjLCBuKTsKICAJICAgICAgICAgIGlmICh1KSB7CiAgCSAgICAgICAgICAgIGlmICh1ID09PSB5KSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIHU7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICAgIGlmICgibmV4dCIgPT09IG4ubWV0aG9kKSBuLnNlbnQgPSBuLl9zZW50ID0gbi5hcmc7ZWxzZSBpZiAoInRocm93IiA9PT0gbi5tZXRob2QpIHsKICAJICAgICAgICAgIGlmIChvID09PSBoKSB0aHJvdyBvID0gcywgbi5hcmc7CiAgCSAgICAgICAgICBuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKTsKICAJICAgICAgICB9IGVsc2UgInJldHVybiIgPT09IG4ubWV0aG9kICYmIG4uYWJydXB0KCJyZXR1cm4iLCBuLmFyZyk7CiAgCSAgICAgICAgbyA9IGY7CiAgCSAgICAgICAgdmFyIHAgPSB0cnlDYXRjaChlLCByLCBuKTsKICAJICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHAudHlwZSkgewogIAkgICAgICAgICAgaWYgKG8gPSBuLmRvbmUgPyBzIDogbCwgcC5hcmcgPT09IHkpIGNvbnRpbnVlOwogIAkgICAgICAgICAgcmV0dXJuIHsKICAJICAgICAgICAgICAgdmFsdWU6IHAuYXJnLAogIAkgICAgICAgICAgICBkb25lOiBuLmRvbmUKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgfQogIAkgICAgICAgICJ0aHJvdyIgPT09IHAudHlwZSAmJiAobyA9IHMsIG4ubWV0aG9kID0gInRocm93Iiwgbi5hcmcgPSBwLmFyZyk7CiAgCSAgICAgIH0KICAJICAgIH07CiAgCSAgfQogIAkgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgcikgewogIAkgICAgdmFyIG4gPSByLm1ldGhvZCwKICAJICAgICAgbyA9IGUuaXRlcmF0b3Jbbl07CiAgCSAgICBpZiAobyA9PT0gdCkgcmV0dXJuIHIuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBuICYmIGUuaXRlcmF0b3JbInJldHVybiJdICYmIChyLm1ldGhvZCA9ICJyZXR1cm4iLCByLmFyZyA9IHQsIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgciksICJ0aHJvdyIgPT09IHIubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbiAmJiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBuICsgIicgbWV0aG9kIikpLCB5OwogIAkgICAgdmFyIGkgPSB0cnlDYXRjaChvLCBlLml0ZXJhdG9yLCByLmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gaS50eXBlKSByZXR1cm4gci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IGkuYXJnLCByLmRlbGVnYXRlID0gbnVsbCwgeTsKICAJICAgIHZhciBhID0gaS5hcmc7CiAgCSAgICByZXR1cm4gYSA/IGEuZG9uZSA/IChyW2UucmVzdWx0TmFtZV0gPSBhLnZhbHVlLCByLm5leHQgPSBlLm5leHRMb2MsICJyZXR1cm4iICE9PSByLm1ldGhvZCAmJiAoci5tZXRob2QgPSAibmV4dCIsIHIuYXJnID0gdCksIHIuZGVsZWdhdGUgPSBudWxsLCB5KSA6IGEgOiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksIHIuZGVsZWdhdGUgPSBudWxsLCB5KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gewogIAkgICAgICB0cnlMb2M6IHRbMF0KICAJICAgIH07CiAgCSAgICAxIGluIHQgJiYgKGUuY2F0Y2hMb2MgPSB0WzFdKSwgMiBpbiB0ICYmIChlLmZpbmFsbHlMb2MgPSB0WzJdLCBlLmFmdGVyTG9jID0gdFszXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGUpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gdC5jb21wbGV0aW9uIHx8IHt9OwogIAkgICAgZS50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSBlLmFyZywgdC5jb21wbGV0aW9uID0gZTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQ29udGV4dCh0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHQuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsKICAJICB9CiAgCSAgZnVuY3Rpb24gdmFsdWVzKGUpIHsKICAJICAgIGlmIChlIHx8ICIiID09PSBlKSB7CiAgCSAgICAgIHZhciByID0gZVthXTsKICAJICAgICAgaWYgKHIpIHJldHVybiByLmNhbGwoZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBlLm5leHQpIHJldHVybiBlOwogIAkgICAgICBpZiAoIWlzTmFOKGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBvID0gLTEsCiAgCSAgICAgICAgICBpID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsrbyA8IGUubGVuZ3RoOykgaWYgKG4uY2FsbChlLCBvKSkgcmV0dXJuIG5leHQudmFsdWUgPSBlW29dLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgcmV0dXJuIGkubmV4dCA9IGk7CiAgCSAgICAgIH0KICAJICAgIH0KICAJICAgIHRocm93IG5ldyBUeXBlRXJyb3IoX3R5cGVvZihlKSArICIgaXMgbm90IGl0ZXJhYmxlIik7CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgbyhnLCAiY29uc3RydWN0b3IiLCB7CiAgCSAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgCSAgICBjb25maWd1cmFibGU6ICEwCiAgCSAgfSksIG8oR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBlLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAodCkgewogIAkgICAgdmFyIGUgPSAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmIHQuY29uc3RydWN0b3I7CiAgCSAgICByZXR1cm4gISFlICYmIChlID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAiR2VuZXJhdG9yRnVuY3Rpb24iID09PSAoZS5kaXNwbGF5TmFtZSB8fCBlLm5hbWUpKTsKICAJICB9LCBlLm1hcmsgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZih0LCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAodC5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKHQsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpKSwgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGcpLCB0OwogIAkgIH0sIGUuYXdyYXAgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgX19hd2FpdDogdAogIAkgICAgfTsKICAJICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGMsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pLCBlLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBlLmFzeW5jID0gZnVuY3Rpb24gKHQsIHIsIG4sIG8sIGkpIHsKICAJICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFByb21pc2UpOwogIAkgICAgdmFyIGEgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKHQsIHIsIG4sIG8pLCBpKTsKICAJICAgIHJldHVybiBlLmlzR2VuZXJhdG9yRnVuY3Rpb24ocikgPyBhIDogYS5uZXh0KCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICByZXR1cm4gdC5kb25lID8gdC52YWx1ZSA6IGEubmV4dCgpOwogIAkgICAgfSk7CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKGcpLCBkZWZpbmUoZywgdSwgIkdlbmVyYXRvciIpLCBkZWZpbmUoZywgYSwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShnLCAidG9TdHJpbmciLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgCSAgfSksIGUua2V5cyA9IGZ1bmN0aW9uICh0KSB7CiAgCSAgICB2YXIgZSA9IE9iamVjdCh0KSwKICAJICAgICAgciA9IFtdOwogIAkgICAgZm9yICh2YXIgbiBpbiBlKSByLnB1c2gobik7CiAgCSAgICByZXR1cm4gci5yZXZlcnNlKCksIGZ1bmN0aW9uIG5leHQoKSB7CiAgCSAgICAgIGZvciAoOyByLmxlbmd0aDspIHsKICAJICAgICAgICB2YXIgdCA9IHIucG9wKCk7CiAgCSAgICAgICAgaWYgKHQgaW4gZSkgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGUudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KGUpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB0LCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gIm5leHQiLCB0aGlzLmFyZyA9IHQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhZSkgZm9yICh2YXIgciBpbiB0aGlzKSAidCIgPT09IHIuY2hhckF0KDApICYmIG4uY2FsbCh0aGlzLCByKSAmJiAhaXNOYU4oK3Iuc2xpY2UoMSkpICYmICh0aGlzW3JdID0gdCk7CiAgCSAgICB9LAogIAkgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAJICAgICAgdGhpcy5kb25lID0gITA7CiAgCSAgICAgIHZhciB0ID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gdGhpcy5ydmFsOwogIAkgICAgfSwKICAJICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihlKSB7CiAgCSAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGU7CiAgCSAgICAgIHZhciByID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKG4sIG8pIHsKICAJICAgICAgICByZXR1cm4gYS50eXBlID0gInRocm93IiwgYS5hcmcgPSBlLCByLm5leHQgPSBuLCBvICYmIChyLm1ldGhvZCA9ICJuZXh0Iiwgci5hcmcgPSB0KSwgISFvOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIG8gPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgbyA+PSAwOyAtLW8pIHsKICAJICAgICAgICB2YXIgaSA9IHRoaXMudHJ5RW50cmllc1tvXSwKICAJICAgICAgICAgIGEgPSBpLmNvbXBsZXRpb247CiAgCSAgICAgICAgaWYgKCJyb290IiA9PT0gaS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogIAkgICAgICAgIGlmIChpLnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBjID0gbi5jYWxsKGksICJjYXRjaExvYyIpLAogIAkgICAgICAgICAgICB1ID0gbi5jYWxsKGksICJmaW5hbGx5TG9jIik7CiAgCSAgICAgICAgICBpZiAoYyAmJiB1KSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShpLmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChjKSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghdSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgaS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGkuZmluYWxseUxvYyk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICB9CiAgCSAgICB9LAogIAkgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodCwgZSkgewogIAkgICAgICBmb3IgKHZhciByID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHIgPj0gMDsgLS1yKSB7CiAgCSAgICAgICAgdmFyIG8gPSB0aGlzLnRyeUVudHJpZXNbcl07CiAgCSAgICAgICAgaWYgKG8udHJ5TG9jIDw9IHRoaXMucHJldiAmJiBuLmNhbGwobywgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBvLmZpbmFsbHlMb2MpIHsKICAJICAgICAgICAgIHZhciBpID0gbzsKICAJICAgICAgICAgIGJyZWFrOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICBpICYmICgiYnJlYWsiID09PSB0IHx8ICJjb250aW51ZSIgPT09IHQpICYmIGkudHJ5TG9jIDw9IGUgJiYgZSA8PSBpLmZpbmFsbHlMb2MgJiYgKGkgPSBudWxsKTsKICAJICAgICAgdmFyIGEgPSBpID8gaS5jb21wbGV0aW9uIDoge307CiAgCSAgICAgIHJldHVybiBhLnR5cGUgPSB0LCBhLmFyZyA9IGUsIGkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGkuZmluYWxseUxvYywgeSkgOiB0aGlzLmNvbXBsZXRlKGEpOwogIAkgICAgfSwKICAJICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSh0LCBlKSB7CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gImJyZWFrIiA9PT0gdC50eXBlIHx8ICJjb250aW51ZSIgPT09IHQudHlwZSA/IHRoaXMubmV4dCA9IHQuYXJnIDogInJldHVybiIgPT09IHQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gdC50eXBlICYmIGUgJiYgKHRoaXMubmV4dCA9IGUpLCB5OwogIAkgICAgfSwKICAJICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKHQpIHsKICAJICAgICAgZm9yICh2YXIgZSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBlID49IDA7IC0tZSkgewogIAkgICAgICAgIHZhciByID0gdGhpcy50cnlFbnRyaWVzW2VdOwogIAkgICAgICAgIGlmIChyLmZpbmFsbHlMb2MgPT09IHQpIHJldHVybiB0aGlzLmNvbXBsZXRlKHIuY29tcGxldGlvbiwgci5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkociksIHk7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godCkgewogIAkgICAgICBmb3IgKHZhciBlID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGUgPj0gMDsgLS1lKSB7CiAgCSAgICAgICAgdmFyIHIgPSB0aGlzLnRyeUVudHJpZXNbZV07CiAgCSAgICAgICAgaWYgKHIudHJ5TG9jID09PSB0KSB7CiAgCSAgICAgICAgICB2YXIgbiA9IHIuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSBuLnR5cGUpIHsKICAJICAgICAgICAgICAgdmFyIG8gPSBuLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShyKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICAgIHJldHVybiBvOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoZSwgciwgbikgewogIAkgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAJICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGUpLAogIAkgICAgICAgIHJlc3VsdE5hbWU6IHIsCiAgCSAgICAgICAgbmV4dExvYzogbgogIAkgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHQpLCB5OwogIAkgICAgfQogIAkgIH0sIGU7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMSkpOwoKICB2YXIgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyA9IHJlZ2VuZXJhdG9yUnVudGltZSQxLmV4cG9ydHM7CgogIC8vIFRPRE8oQmFiZWwgOCk6IFJlbW92ZSB0aGlzIGZpbGUuCgogIHZhciBydW50aW1lID0gcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cygpOwogIHZhciByZWdlbmVyYXRvciA9IHJ1bnRpbWU7CgogIC8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS9ydW50aW1lLmpzI0w3MzY9CiAgdHJ5IHsKICAgIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOwogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOwogICAgfQogIH0KCiAgdmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMocmVnZW5lcmF0b3IpOwoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQ0KICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZDQogIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SDQogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgew0KICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH0NCiAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICB9KTsNCiAgfQoKICBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2skMShpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gX3R5cGVvZihvKSB7CiAgICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAgIHJldHVybiBfdHlwZW9mID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmICJzeW1ib2wiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgewogICAgICByZXR1cm4gdHlwZW9mIG87CiAgICB9IDogZnVuY3Rpb24gKG8pIHsKICAgICAgcmV0dXJuIG8gJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2YgbzsKICAgIH0sIF90eXBlb2Yobyk7CiAgfQoKICBmdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsKICAgIGlmIChfdHlwZW9mKGlucHV0KSAhPT0gIm9iamVjdCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsKICAgIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsKICAgIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsKICAgICAgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCAiZGVmYXVsdCIpOwogICAgICBpZiAoX3R5cGVvZihyZXMpICE9PSAib2JqZWN0IikgcmV0dXJuIHJlczsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKTsKICAgIH0KICAgIHJldHVybiAoaGludCA9PT0gInN0cmluZyIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsKICB9CgogIGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgewogICAgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsICJzdHJpbmciKTsKICAgIHJldHVybiBfdHlwZW9mKGtleSkgPT09ICJzeW1ib2wiID8ga2V5IDogU3RyaW5nKGtleSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQxKHRhcmdldCwgcHJvcHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOwogICAgfQogIH0KICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkMShDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQxKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsKICAgICAgby5fX3Byb3RvX18gPSBwOwogICAgICByZXR1cm4gbzsKICAgIH07CiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogICAgfQogICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7CiAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOwogIH0KCiAgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsKICAgIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsKICAgICAgcmV0dXJuIGNhbGw7CiAgICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpOwogICAgfQogICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7CiAgfQoKICBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgewogICAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7CiAgICB9OwogICAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsKICB9CgogIC8qDQogICAgQ29weXJpZ2h0IDIwMjItMjAyMyBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyoqDQogICAqIEJhc2VQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gUHZGaWxlKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBQdkZpbGUpOwogICAgICB0aGlzLl9wYXRoID0gJyc7CiAgICB9CiAgICAvKioNCiAgICAgKiBHZXR0ZXIgZm9yIGZpbGUncyBtZXRhIGluZm9ybWF0aW9uLg0KICAgICAqLwogICAgX2NyZWF0ZUNsYXNzJDEoUHZGaWxlLCBbewogICAgICBrZXk6ICJtZXRhIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgaWYgKHRoaXMuX21ldGEgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oewogICAgICAgICAgdmVyc2lvbjogMAogICAgICAgIH0sIHRoaXMuX21ldGEpOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogR2V0IHRoZSBmaWxlIHBvaW50ZXIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIHBvaW50ZXIgdG8gQmFzZVB2RmlsZSBpbnN0YW5jZSB0byBnZXQgZnJvbSB0aGUgbWFwLg0KICAgICAgICogQHJldHVybnMgQmFzZVB2RmlsZSByZXR1cm5zIHRoZSBjdXJyZW50IGZpbGUgaW5zdGFuY2UgcmVsYXRlZCB0byBwdHIuDQogICAgICAgKi8KICAgIH1dLCBbewogICAgICBrZXk6ICJnZXRQdHIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHRyKHB0cikgewogICAgICAgIGlmIChQdkZpbGUuX2ZpbGVQdHJzLmhhcyhwdHIpKSB7CiAgICAgICAgICByZXR1cm4gUHZGaWxlLl9maWxlUHRycy5nZXQocHRyKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIGluc3RhbmNlIG5vdCBmb3VuZC4nKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNhdmVzIHRoZSBCYXNlUHZGaWxlIGluc3RhbmNlIHRvIHRoZSBtYXAgd2l0aCBhbiBhc3NvY2lhdGVkIHB0ci4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byBzYXZlIGFzIHRoZSBrZXkuDQogICAgICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gc2F2ZSBhcyB0aGUgdmFsdWUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFB0cihwdHIsIGluc3RhbmNlKSB7CiAgICAgICAgUHZGaWxlLl9maWxlUHRycy5zZXQocHRyLCBpbnN0YW5jZSk7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBSZW1vdmVzIHRoZSBwdHIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byByZW1vdmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlUHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVB0cihwdHIpIHsKICAgICAgICBQdkZpbGUuX2ZpbGVQdHJzWyJkZWxldGUiXShwdHIpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlOwogIH0oKTsKICBQdkZpbGUuX2ZpbGVQdHJzID0gbmV3IE1hcCgpOwoKICBmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQogIGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CiAgLyoqDQogICAqIFB2RmlsZU1lbSBDbGFzcw0KICAgKiBUaGlzIGNsYXNzIG1vY2tzIHRoZSBmaWxlIHN5c3RlbSB1c2luZyBpbi1tZW1vcnkgc3RvcmFnZS4NCiAgICovCiAgdmFyIFB2RmlsZU1lbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B2RmlsZSkgewogICAgX2luaGVyaXRzKFB2RmlsZU1lbSwgX1B2RmlsZSk7CiAgICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFB2RmlsZU1lbSk7CiAgICBmdW5jdGlvbiBQdkZpbGVNZW0ocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBQdkZpbGVNZW0pOwogICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpOwogICAgICBfdGhpcy5fcG9zID0gMDsKICAgICAgX3RoaXMuX3BhdGggPSBwYXRoOwogICAgICBfdGhpcy5fbWV0YSA9IG1ldGE7CiAgICAgIF90aGlzLl9tb2RlID0gbW9kZTsKICAgICAgcmV0dXJuIF90aGlzOwogICAgfQogICAgX2NyZWF0ZUNsYXNzJDEoUHZGaWxlTWVtLCBbewogICAgICBrZXk6ICJjbG9zZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZSgpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVhZCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZWFkKHNpemUsIGNvdW50KSB7CiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2lzRU9GKSB7CiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFT0YiKTsKICAgICAgICAgIGVyci5uYW1lID0gIkVuZE9mRmlsZSI7CiAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgfQogICAgICAgIHZhciB0b0NvcHkgPSBNYXRoLm1pbihzaXplICogY291bnQsIHRoaXMuX2ZpbGUubGVuZ3RoIC0gdGhpcy5fcG9zKTsKICAgICAgICB2YXIgdG90YWxFbGVtcyA9IHRvQ29weSAtIHRvQ29weSAlIHNpemU7CiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRvdGFsRWxlbXMpOwogICAgICAgIGJ1ZmZlci5zZXQodGhpcy5fZmlsZS5zbGljZSh0aGlzLl9wb3MsIHRoaXMuX3BvcyArIHRvdGFsRWxlbXMpLCAwKTsKICAgICAgICB0aGlzLl9wb3MgKz0gdG90YWxFbGVtczsKICAgICAgICByZXR1cm4gYnVmZmVyOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIndyaXRlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHdyaXRlKGNvbnRlbnQpIHsKICAgICAgICB2YXIgbmV3RmlsZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3BvcyArIGNvbnRlbnQubGVuZ3RoKTsKICAgICAgICBpZiAodGhpcy5fZmlsZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBuZXdGaWxlLnNldCh0aGlzLl9maWxlLnNsaWNlKDAsIHRoaXMuX3BvcykpOwogICAgICAgICAgbmV3RmlsZS5zZXQoY29udGVudCwgdGhpcy5fcG9zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3RmlsZS5zZXQoY29udGVudCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ZpbGUgPSBuZXdGaWxlOwogICAgICAgIHRoaXMuX3BvcyArPSBjb250ZW50Lmxlbmd0aDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJzZWVrIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlZWsob2Zmc2V0LCB3aGVuY2UpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkgJiYgdGhpcy5fbW9kZSA9PT0gInJlYWRvbmx5IikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCInIi5jb25jYXQodGhpcy5fcGF0aCwgIicgZG9lc24ndCBleGlzdC4iKSk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSkgewogICAgICAgICAgLy8gVGhpcyBpcyB2YWxpZCBpbiBJU08gQyBidXQgbm90IHN1cHBvcnRlZCBieSB0aGlzIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJyIuY29uY2F0KHRoaXMuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgIH0KICAgICAgICBpZiAob2Zmc2V0IDwgMCkgewogICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRU9GIik7CiAgICAgICAgICBlcnIubmFtZSA9ICJFbmRPZkZpbGUiOwogICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgIH0KICAgICAgICB2YXIgbmV3T2Zmc2V0OwogICAgICAgIGlmICh3aGVuY2UgPT09IDApIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKG9mZnNldCwgdGhpcy5fZmlsZS5sZW5ndGgpOwogICAgICAgIH0gZWxzZSBpZiAod2hlbmNlID09PSAxKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbih0aGlzLl9wb3MgKyBvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKHdoZW5jZSA9PT0gMikgewogICAgICAgICAgbmV3T2Zmc2V0ID0gTWF0aC5taW4odGhpcy5fZmlsZS5sZW5ndGggKyBvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG9wZXJhdGlvbjogIi5jb25jYXQod2hlbmNlLCAiLiIpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcG9zID0gbmV3T2Zmc2V0OwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInRlbGwiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gdGVsbCgpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkpIHsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvczsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKCkgewogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpZiAodGhpcy5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVOT0VOVCIpOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIFB2RmlsZU1lbS5fbWVtRmlsZXNbImRlbGV0ZSJdKHRoaXMuX3BhdGgpOwogICAgICAgICAgICAgICAgdGhpcy5fcG9zID0gMDsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpOwogICAgICAgIH0pKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJleGlzdHMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9maWxlICE9PSB1bmRlZmluZWQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2lzRU9GIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcyA+PSB0aGlzLl9maWxlLmxlbmd0aDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfZmlsZSIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBQdkZpbGVNZW0uX21lbUZpbGVzLmdldCh0aGlzLl9wYXRoKTsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoY29udGVudCkgewogICAgICAgIFB2RmlsZU1lbS5fbWVtRmlsZXMuc2V0KHRoaXMuX3BhdGgsIGNvbnRlbnQpOwogICAgICB9CiAgICB9XSwgW3sKICAgICAga2V5OiAib3BlbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHBhdGgsIG1vZGUpIHsKICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZU1lbS5fbWVtRmlsZXMuZ2V0KHBhdGgpOwogICAgICAgIHZhciBkYk1vZGUgPSBtb2RlLmluY2x1ZGVzKCdyJykgPyAicmVhZG9ubHkiIDogInJlYWR3cml0ZSI7CiAgICAgICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCAmJiBkYk1vZGUgPT09ICJyZWFkb25seSIpIHsKICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigiJyIuY29uY2F0KHBhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgICAgZXJyb3IubmFtZSA9ICJGaWxlTm90RXhpc3RzIjsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgICB2YXIgZmlsZU1lbSA9IG5ldyBQdkZpbGVNZW0ocGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRiTW9kZSk7CiAgICAgICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2EnKSkgewogICAgICAgICAgZmlsZU1lbS5zZWVrKDAsIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmlsZU1lbTsKICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIFB2RmlsZU1lbTsKICB9KFB2RmlsZSk7CiAgUHZGaWxlTWVtLl9tZW1GaWxlcyA9IG5ldyBNYXAoKTsKICAvKioNCiAgICogQ2FzdCBhIHNpZ25lZCBhZGRyZXNzIHRvIHVuc2lnbmVkIGFkZHJlc3MuDQogICAqDQogICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGNhc3QgdG8gdW5zaWduZWQgYWRkcmVzcy4NCiAgICovCiAgZnVuY3Rpb24gdW5zaWduZWRBZGRyZXNzKGFkZHJlc3MpIHsKICAgIGlmIChhZGRyZXNzIDwgMCkgewogICAgICByZXR1cm4gYWRkcmVzcyA+Pj4gMDsKICAgIH0KICAgIHJldHVybiBhZGRyZXNzOwogIH0KCiAgdmFyIFB2WHB1QWN0aW9uOwogIChmdW5jdGlvbiAoUHZYcHVBY3Rpb24pIHsKICAgIFB2WHB1QWN0aW9uW1B2WHB1QWN0aW9uWyJJTklUIl0gPSAwXSA9ICJJTklUIjsKICAgIFB2WHB1QWN0aW9uW1B2WHB1QWN0aW9uWyJBTExPQyJdID0gMV0gPSAiQUxMT0MiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIkZSRUUiXSA9IDJdID0gIkZSRUUiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIkNPUFlfVE9fWFBVIl0gPSAzXSA9ICJDT1BZX1RPX1hQVSI7CiAgICBQdlhwdUFjdGlvbltQdlhwdUFjdGlvblsiQ09QWV9GUk9NX1hQVSJdID0gNF0gPSAiQ09QWV9GUk9NX1hQVSI7CiAgICBQdlhwdUFjdGlvbltQdlhwdUFjdGlvblsiTUVNU0VUIl0gPSA1XSA9ICJNRU1TRVQiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIlRJTUVSX1NUQVJUIl0gPSA2XSA9ICJUSU1FUl9TVEFSVCI7CiAgICBQdlhwdUFjdGlvbltQdlhwdUFjdGlvblsiVElNRVJfU1RPUCJdID0gN10gPSAiVElNRVJfU1RPUCI7CiAgICAvLyBvdGhlciB4cHUgYWN0aW9ucwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIk1BVFJJWF9WRUNUT1JfTVVMVElQTFkiXSA9IDhdID0gIk1BVFJJWF9WRUNUT1JfTVVMVElQTFkiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIlNZTkNfVkVDVE9SIl0gPSA5XSA9ICJTWU5DX1ZFQ1RPUiI7CiAgfSkoUHZYcHVBY3Rpb24gfHwgKFB2WHB1QWN0aW9uID0ge30pKTsKCiAgY29uc3Qgd2FzaV9zbmFwc2hvdF9wcmV2aWV3MV9lbXVsYXRvciA9IHsKICAgIGFyZ3NfZ2V0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgYXJnc19zaXplc19nZXQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBlbnZpcm9uX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGVudmlyb25fc2l6ZXNfZ2V0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgY2xvY2tfcmVzX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGNsb2NrX3RpbWVfZ2V0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWR2aXNlOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWxsb2NhdGU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9jbG9zZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2RhdGFzeW5jOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmRzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Zkc3RhdF9zZXRfZmxhZ3M6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9mZHN0YXRfc2V0X3JpZ2h0czogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2ZpbGVzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2ZpbGVzdGF0X3NldF9zaXplOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmlsZXN0YXRfc2V0X3RpbWVzOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcHJlYWQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wcmVzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3ByZXN0YXRfZGlyX25hbWU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wd3JpdGU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9yZWFkOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcmVhZGRpcjogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3JlbnVtYmVyOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfc2VlazogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3N5bmM6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF90ZWxsOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfd3JpdGU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2NyZWF0ZV9kaXJlY3Rvcnk6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2ZpbGVzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfZmlsZXN0YXRfc2V0X3RpbWVzOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9saW5rOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9vcGVuOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9yZWFkbGluazogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfcmVtb3ZlX2RpcmVjdG9yeTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfcmVuYW1lOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9zeW1saW5rOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF91bmxpbmtfZmlsZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBvbGxfb25lb2ZmOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19leGl0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19yYWlzZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNjaGVkX3lpZWxkOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcmFuZG9tX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfcmVjdjogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfc2VuZDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfc2h1dGRvd246IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgfTsKCiAgdmFyIG1hdHJpeFZlY3Rvck11bHRpcGx5ID0gZnVuY3Rpb24gbWF0cml4VmVjdG9yTXVsdGlwbHkoZGF0YSkgewogICAgdmFyIF9kYXRhJGdsb2JhbHMgPSBkYXRhLmdsb2JhbHMsCiAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzLmV4cG9ydHMsCiAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFscy5tZW1BbGxvYywKICAgICAgbWVtb3J5ID0gX2RhdGEkZ2xvYmFscy5tZW1vcnk7CiAgICB2YXIgbWF0cml4QWRkcmVzcyA9IGRhdGEubWF0cml4QWRkcmVzcywKICAgICAgdmVjdG9yQWRkcmVzcyA9IGRhdGEudmVjdG9yQWRkcmVzcywKICAgICAgbSA9IGRhdGEubSwKICAgICAgbiA9IGRhdGEubiwKICAgICAgcmVzdWx0QWRkcmVzcyA9IGRhdGEucmVzdWx0QWRkcmVzczsKICAgIHZhciBwdl9tYXRyaXhfdmVjdG9yX211bHRpcGx5ID0gZXhwb3J0cy5wdl9tYXRyaXhfdmVjdG9yX211bHRpcGx5OwogICAgaWYgKCFtZW1BbGxvYy5oYXMobWF0cml4QWRkcmVzcykgfHwgIW1lbUFsbG9jLmhhcyh2ZWN0b3JBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKHJlc3VsdEFkZHJlc3MpKSB7CiAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KDApOwogICAgfQogICAgdmFyIG1lbW9yeUJ1ZmZlckZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgdmFyIF9tZW1BbGxvYyRnZXQgPSBtZW1BbGxvYy5nZXQobWF0cml4QWRkcmVzcyksCiAgICAgIHdvcmtlck1hdHJpeEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Lndvcmtlck1lbUFkZHJlc3M7CiAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQodmVjdG9yQWRkcmVzcyksCiAgICAgIHdvcmtlclZlY3RvckFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Mi53b3JrZXJNZW1BZGRyZXNzOwogICAgdmFyIF9tZW1BbGxvYyRnZXQzID0gbWVtQWxsb2MuZ2V0KHJlc3VsdEFkZHJlc3MpLAogICAgICB3b3JrZXJSZXN1bHRBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgIHB2X21hdHJpeF92ZWN0b3JfbXVsdGlwbHkod29ya2VyTWF0cml4QWRkcmVzcywgd29ya2VyVmVjdG9yQWRkcmVzcywgbSwgbiwgd29ya2VyUmVzdWx0QWRkcmVzcyk7CiAgICByZXR1cm4gbWVtb3J5QnVmZmVyRmxvYXQzMi5zbGljZSh3b3JrZXJSZXN1bHRBZGRyZXNzIC8gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCB3b3JrZXJSZXN1bHRBZGRyZXNzIC8gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICsgbSk7CiAgfTsKICB2YXIgc3luY1ZlY3RvciA9IGZ1bmN0aW9uIHN5bmNWZWN0b3IoZGF0YSkgewogICAgdmFyIF9kYXRhJGdsb2JhbHMyID0gZGF0YS5nbG9iYWxzLAogICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMyLm1lbUFsbG9jLAogICAgICBtZW1vcnkgPSBfZGF0YSRnbG9iYWxzMi5tZW1vcnk7CiAgICB2YXIgdmVjdG9yQWRkcmVzcyA9IGRhdGEudmVjdG9yQWRkcmVzcywKICAgICAgYnVmZmVyID0gZGF0YS5idWZmZXI7CiAgICBpZiAobWVtQWxsb2MuaGFzKHZlY3RvckFkZHJlc3MpKSB7CiAgICAgIHZhciBtZW1vcnlCdWZmZXJGbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ0ID0gbWVtQWxsb2MuZ2V0KHZlY3RvckFkZHJlc3MpLAogICAgICAgIHdvcmtlck1lbUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NC53b3JrZXJNZW1BZGRyZXNzOwogICAgICBtZW1vcnlCdWZmZXJGbG9hdDMyLnNldChidWZmZXIsIHdvcmtlck1lbUFkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgfQogIH07CiAgdmFyIHB2TXZtQWN0aW9uTWFwID0gX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZYcHVBY3Rpb24uTUFUUklYX1ZFQ1RPUl9NVUxUSVBMWSwgbWF0cml4VmVjdG9yTXVsdGlwbHkpLCBQdlhwdUFjdGlvbi5TWU5DX1ZFQ1RPUiwgc3luY1ZlY3Rvcik7CgogIC8qIGVzbGludCBjYW1lbGNhc2U6IDAgKi8KICB2YXIgUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uOwogIChmdW5jdGlvbiAoUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uKSB7CiAgICBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uWyJBVFRFTlRJT05fUFJFQ09NUFVURV9FTkNPRElORyJdID0gMjAwXSA9ICJBVFRFTlRJT05fUFJFQ09NUFVURV9FTkNPRElORyI7CiAgICBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uWyJBVFRFTlRJT05fQVRURU5EX0NPTUJJTkVEIl0gPSAyMDFdID0gIkFUVEVOVElPTl9BVFRFTkRfQ09NQklORUQiOwogIH0pKFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbiB8fCAoUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uID0ge30pKTsKCiAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsKICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOwogICAgfQogIH0KICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7CiAgICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICB9CgogIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvWyJAQGl0ZXJhdG9yIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CiAgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfQogIHZhciBQdlhwdSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBQdlhwdSgpIHsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFB2WHB1KTsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyhQdlhwdSwgbnVsbCwgW3sKICAgICAga2V5OiAiYWRkWHB1IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFhwdShvYmpBZGRyZXNzLCBkYXRhKSB7CiAgICAgICAgUHZYcHUueHB1T2JqZWN0cy5zZXQob2JqQWRkcmVzcywgZGF0YSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZ2V0WHB1IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFhwdShvYmpBZGRyZXNzKSB7CiAgICAgICAgcmV0dXJuIFB2WHB1LnhwdU9iamVjdHMuZ2V0KG9iakFkZHJlc3MpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImhhc1hwdSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNYcHUob2JqQWRkcmVzcykgewogICAgICAgIHJldHVybiBQdlhwdS54cHVPYmplY3RzLmhhcyhvYmpBZGRyZXNzKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmVYcHUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlWHB1KG9iakFkZHJlc3MpIHsKICAgICAgICBpZiAoUHZYcHUueHB1T2JqZWN0cy5oYXMob2JqQWRkcmVzcykpIHsKICAgICAgICAgIHZhciBfUHZYcHUkeHB1T2JqZWN0cyRnZXQgPSBQdlhwdS54cHVPYmplY3RzLmdldChvYmpBZGRyZXNzKSwKICAgICAgICAgICAgZGV2aWNlTWVtID0gX1B2WHB1JHhwdU9iamVjdHMkZ2V0LmRldmljZU1lbTsKICAgICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihkZXZpY2VNZW0pLAogICAgICAgICAgICBfc3RlcDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CiAgICAgICAgICAgICAgdmFyIG1lbUFkZHJlc3MgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgICAgICBQdlhwdS5tZW1vcnlPYmplY3RzWyJkZWxldGUiXShtZW1BZGRyZXNzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBfaXRlcmF0b3IuZigpOwogICAgICAgICAgfQogICAgICAgICAgUHZYcHUueHB1T2JqZWN0c1siZGVsZXRlIl0ob2JqQWRkcmVzcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImFkZE1lbW9yeSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRNZW1vcnkobWVtQWRkcmVzcywgZGF0YSkgewogICAgICAgIFB2WHB1Lm1lbW9yeU9iamVjdHMuc2V0KG1lbUFkZHJlc3MsIGRhdGEpOwogICAgICAgIFB2WHB1LnhwdU9iamVjdHMuZ2V0KGRhdGEub2JqQWRkcmVzcykuZGV2aWNlTWVtLmFkZChtZW1BZGRyZXNzKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRNZW1vcnkiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TWVtb3J5KG1lbUFkZHJlc3MpIHsKICAgICAgICByZXR1cm4gUHZYcHUubWVtb3J5T2JqZWN0cy5nZXQobWVtQWRkcmVzcyk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiaGFzTWVtb3J5IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhc01lbW9yeShtZW1BZGRyZXNzKSB7CiAgICAgICAgcmV0dXJuIFB2WHB1Lm1lbW9yeU9iamVjdHMuaGFzKG1lbUFkZHJlc3MpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInJlbW92ZU1lbW9yeSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVNZW1vcnkobWVtQWRkcmVzcykgewogICAgICAgIGlmIChQdlhwdS5oYXNNZW1vcnkobWVtQWRkcmVzcykpIHsKICAgICAgICAgIFB2WHB1LnhwdU9iamVjdHMuZ2V0KFB2WHB1LmdldE1lbW9yeShtZW1BZGRyZXNzKS5vYmpBZGRyZXNzKS5kZXZpY2VNZW1bImRlbGV0ZSJdKG1lbUFkZHJlc3MpOwogICAgICAgIH0KICAgICAgICBQdlhwdS5tZW1vcnlPYmplY3RzWyJkZWxldGUiXShtZW1BZGRyZXNzKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRVbmlxdWVQb2ludGVyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFVuaXF1ZVBvaW50ZXIoKSB7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIHZhciBwdHIgPSBNYXRoLmNlaWwoKHBlcmZvcm1hbmNlLm5vdygpICsgTWF0aC5yYW5kb20oKSkgKiAxMGUyKTsKICAgICAgICAgIGlmICghdGhpcy51bmlxdWVQb2ludGVycy5oYXMocHRyKSkgewogICAgICAgICAgICB0aGlzLnVuaXF1ZVBvaW50ZXJzLmFkZChwdHIpOwogICAgICAgICAgICByZXR1cm4gcHRyOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmVVbmlxdWVQb2ludGVyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVVuaXF1ZVBvaW50ZXIocHRyKSB7CiAgICAgICAgaWYgKHRoaXMudW5pcXVlUG9pbnRlcnMuaGFzKHB0cikpIHsKICAgICAgICAgIHRoaXMudW5pcXVlUG9pbnRlcnNbImRlbGV0ZSJdKHB0cik7CiAgICAgICAgfQogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZYcHU7CiAgfSgpOwogIF9kZWZpbmVQcm9wZXJ0eShQdlhwdSwgInhwdU9iamVjdHMiLCBuZXcgTWFwKCkpOwogIF9kZWZpbmVQcm9wZXJ0eShQdlhwdSwgIm1lbW9yeU9iamVjdHMiLCBuZXcgTWFwKCkpOwogIF9kZWZpbmVQcm9wZXJ0eShQdlhwdSwgInVuaXF1ZVBvaW50ZXJzIiwgbmV3IFNldCgpKTsKCiAgdmFyIGF0dGVudGlvblByZWNvbXB1dGVFbmNvZGluZyA9IGZ1bmN0aW9uIGF0dGVudGlvblByZWNvbXB1dGVFbmNvZGluZyhkYXRhKSB7CiAgICB2YXIgX2RhdGEkZ2xvYmFscyA9IGRhdGEuZ2xvYmFscywKICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMuZXhwb3J0cywKICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzLm1lbUFsbG9jOwogICAgdmFyIGVuY29kaW5nQWRkcmVzcyA9IGRhdGEuZW5jb2RpbmdBZGRyZXNzLAogICAgICBkaW1lbnNpb24gPSBkYXRhLmRpbWVuc2lvbiwKICAgICAgc3RlcHMgPSBkYXRhLnN0ZXBzLAogICAgICB0aGV0YSA9IGRhdGEudGhldGE7CiAgICB2YXIgcHZfcGljb2xsbV9hdHRlbnRpb25fcHJlY29tcHV0ZV9lbmNvZGluZ193YXNtID0gZXhwb3J0cy5wdl9waWNvbGxtX2F0dGVudGlvbl9wcmVjb21wdXRlX2VuY29kaW5nX3dhc207CiAgICB2YXIgX21lbUFsbG9jJGdldCA9IG1lbUFsbG9jLmdldChlbmNvZGluZ0FkZHJlc3MpLAogICAgICB3b3JrZXJFbmNvZGluZ0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Lndvcmtlck1lbUFkZHJlc3M7CiAgICBwdl9waWNvbGxtX2F0dGVudGlvbl9wcmVjb21wdXRlX2VuY29kaW5nX3dhc20od29ya2VyRW5jb2RpbmdBZGRyZXNzLCBkaW1lbnNpb24sIHN0ZXBzLCB0aGV0YSk7CiAgfTsKICB2YXIgYXR0ZW50aW9uQXR0ZW5kQ29tYmluZWQgPSBmdW5jdGlvbiBhdHRlbnRpb25BdHRlbmRDb21iaW5lZChkYXRhKSB7CiAgICB2YXIgX2RhdGEkZ2xvYmFsczIgPSBkYXRhLmdsb2JhbHMsCiAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzMi5leHBvcnRzLAogICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMyLm1lbUFsbG9jLAogICAgICBtZW1vcnkgPSBfZGF0YSRnbG9iYWxzMi5tZW1vcnk7CiAgICB2YXIgbnVtSGVhZHMgPSBkYXRhLm51bUhlYWRzLAogICAgICBudW1LdkhlYWRzID0gZGF0YS5udW1LdkhlYWRzLAogICAgICB3aW5kb3dMZW5ndGggPSBkYXRhLndpbmRvd0xlbmd0aCwKICAgICAgaGVhZERpbWVuc2lvbiA9IGRhdGEuaGVhZERpbWVuc2lvbiwKICAgICAgcm9wZURpbWVuc2lvbiA9IGRhdGEucm9wZURpbWVuc2lvbiwKICAgICAgcm9wZUludGVybGVhdmVkID0gZGF0YS5yb3BlSW50ZXJsZWF2ZWQsCiAgICAgIG5ld0VuY29kaW5nQWRkcmVzcyA9IGRhdGEubmV3RW5jb2RpbmdBZGRyZXNzLAogICAgICBxQnVmZmVyID0gZGF0YS5xQnVmZmVyLAogICAgICBrQnVmZmVyID0gZGF0YS5rQnVmZmVyLAogICAgICB2QnVmZmVyID0gZGF0YS52QnVmZmVyLAogICAgICBrZXlzQWRkcmVzcyA9IGRhdGEua2V5c0FkZHJlc3MsCiAgICAgIGtleUludGVyY2VwdHNBZGRyZXNzID0gZGF0YS5rZXlJbnRlcmNlcHRzQWRkcmVzcywKICAgICAga2V5U2xvcGVzQWRkcmVzcyA9IGRhdGEua2V5U2xvcGVzQWRkcmVzcywKICAgICAgdmFsdWVzQWRkcmVzcyA9IGRhdGEudmFsdWVzQWRkcmVzcywKICAgICAgdmFsdWVJbnRlcmNlcHRzQWRkcmVzcyA9IGRhdGEudmFsdWVJbnRlcmNlcHRzQWRkcmVzcywKICAgICAgdmFsdWVTbG9wZXNBZGRyZXNzID0gZGF0YS52YWx1ZVNsb3Blc0FkZHJlc3MsCiAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbiwKICAgICAgcXVlcnlBZGRyZXNzID0gZGF0YS5xdWVyeUFkZHJlc3MsCiAgICAgIG4gPSBkYXRhLm47CiAgICB2YXIgYWxpZ25lZF9hbGxvYyA9IGV4cG9ydHMuYWxpZ25lZF9hbGxvYywKICAgICAgZnJlZSA9IGV4cG9ydHMuZnJlZSwKICAgICAgcHZfcGljb2xsbV9hdHRlbnRpb25fZW5jb2RlX3dhc20gPSBleHBvcnRzLnB2X3BpY29sbG1fYXR0ZW50aW9uX2VuY29kZV93YXNtLAogICAgICBwdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfa2V5c193YXNtID0gZXhwb3J0cy5wdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfa2V5c193YXNtLAogICAgICBwdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfdmFsdWVzX3dhc20gPSBleHBvcnRzLnB2X3BpY29sbG1fYXR0ZW50aW9uX3VwZGF0ZV92YWx1ZXNfd2FzbSwKICAgICAgcHZfcGljb2xsbV9hdHRlbnRpb25fdHJhbnNwb3NlX3F1ZXJ5X3dhc20gPSBleHBvcnRzLnB2X3BpY29sbG1fYXR0ZW50aW9uX3RyYW5zcG9zZV9xdWVyeV93YXNtLAogICAgICBwdl9waWNvbGxtX2F0dGVudGlvbl9hdHRlbmRfd2FzbSA9IGV4cG9ydHMucHZfcGljb2xsbV9hdHRlbnRpb25fYXR0ZW5kX3dhc207CiAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQobmV3RW5jb2RpbmdBZGRyZXNzKSwKICAgICAgd29ya2VyRW5jb2RpbmdBZGRyZXNzID0gX21lbUFsbG9jJGdldDIud29ya2VyTWVtQWRkcmVzczsKICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldChrZXlzQWRkcmVzcyksCiAgICAgIHdvcmtlcktleXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgIHZhciBfbWVtQWxsb2MkZ2V0NCA9IG1lbUFsbG9jLmdldChrZXlJbnRlcmNlcHRzQWRkcmVzcyksCiAgICAgIHdvcmtlcktleUludGVyY2VwdHNBZGRyZXNzID0gX21lbUFsbG9jJGdldDQud29ya2VyTWVtQWRkcmVzczsKICAgIHZhciBfbWVtQWxsb2MkZ2V0NSA9IG1lbUFsbG9jLmdldChrZXlTbG9wZXNBZGRyZXNzKSwKICAgICAgd29ya2VyS2V5U2xvcGVzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ1Lndvcmtlck1lbUFkZHJlc3M7CiAgICB2YXIgX21lbUFsbG9jJGdldDYgPSBtZW1BbGxvYy5nZXQodmFsdWVzQWRkcmVzcyksCiAgICAgIHdvcmtlclZhbHVlc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Ni53b3JrZXJNZW1BZGRyZXNzOwogICAgdmFyIF9tZW1BbGxvYyRnZXQ3ID0gbWVtQWxsb2MuZ2V0KHZhbHVlSW50ZXJjZXB0c0FkZHJlc3MpLAogICAgICB3b3JrZXJWYWx1ZUludGVyY2VwdHNBZGRyZXNzID0gX21lbUFsbG9jJGdldDcud29ya2VyTWVtQWRkcmVzczsKICAgIHZhciBfbWVtQWxsb2MkZ2V0OCA9IG1lbUFsbG9jLmdldCh2YWx1ZVNsb3Blc0FkZHJlc3MpLAogICAgICB3b3JrZXJWYWx1ZVNsb3Blc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0OC53b3JrZXJNZW1BZGRyZXNzOwogICAgdmFyIF9tZW1BbGxvYyRnZXQ5ID0gbWVtQWxsb2MuZ2V0KHF1ZXJ5QWRkcmVzcyksCiAgICAgIHdvcmtlclF1ZXJ5QWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ5Lndvcmtlck1lbUFkZHJlc3M7CiAgICB2YXIgd29ya2VyUUFkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgcUJ1ZmZlci5sZW5ndGggKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgdmFyIHdvcmtlcktBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIGtCdWZmZXIubGVuZ3RoICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgIHZhciB3b3JrZXJWQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCB2QnVmZmVyLmxlbmd0aCAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICB2YXIgbGVuZ3RoID0gbnVtSGVhZHMgKiBoZWFkRGltZW5zaW9uICogbjsKICAgIHZhciB3b3JrZXJPdXRwdXRBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIGxlbmd0aCAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICB2YXIgbWVtb3J5QnVmZmVyRmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICBtZW1vcnlCdWZmZXJGbG9hdDMyLnNldChxQnVmZmVyLCB3b3JrZXJRQWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICBtZW1vcnlCdWZmZXJGbG9hdDMyLnNldChrQnVmZmVyLCB3b3JrZXJLQWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICBtZW1vcnlCdWZmZXJGbG9hdDMyLnNldCh2QnVmZmVyLCB3b3JrZXJWQWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICBtZW1vcnlCdWZmZXJGbG9hdDMyLmZpbGwoMCwgd29ya2VyT3V0cHV0QWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgd29ya2VyT3V0cHV0QWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCArIGxlbmd0aCk7CiAgICBwdl9waWNvbGxtX2F0dGVudGlvbl9lbmNvZGVfd2FzbSh3b3JrZXJRQWRkcmVzcywgd29ya2VyRW5jb2RpbmdBZGRyZXNzLCBuLCBudW1IZWFkcywgcm9wZUludGVybGVhdmVkLCBoZWFkRGltZW5zaW9uLCByb3BlRGltZW5zaW9uLCBwb3NpdGlvbik7CiAgICBwdl9waWNvbGxtX2F0dGVudGlvbl90cmFuc3Bvc2VfcXVlcnlfd2FzbShuLCB3b3JrZXJRQWRkcmVzcywgd29ya2VyUXVlcnlBZGRyZXNzLCBudW1IZWFkcywgaGVhZERpbWVuc2lvbik7CiAgICBwdl9waWNvbGxtX2F0dGVudGlvbl9lbmNvZGVfd2FzbSh3b3JrZXJLQWRkcmVzcywgd29ya2VyRW5jb2RpbmdBZGRyZXNzLCBuLCBudW1LdkhlYWRzLCByb3BlSW50ZXJsZWF2ZWQsIGhlYWREaW1lbnNpb24sIHJvcGVEaW1lbnNpb24sIHBvc2l0aW9uKTsKICAgIHB2X3BpY29sbG1fYXR0ZW50aW9uX3VwZGF0ZV9rZXlzX3dhc20obnVtS3ZIZWFkcywgd2luZG93TGVuZ3RoLCBoZWFkRGltZW5zaW9uLCB3b3JrZXJLZXlzQWRkcmVzcywgd29ya2VyS2V5SW50ZXJjZXB0c0FkZHJlc3MsIHdvcmtlcktleVNsb3Blc0FkZHJlc3MsIHBvc2l0aW9uLCBuLCB3b3JrZXJLQWRkcmVzcyk7CiAgICBwdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfdmFsdWVzX3dhc20obnVtS3ZIZWFkcywgd2luZG93TGVuZ3RoLCBoZWFkRGltZW5zaW9uLCB3b3JrZXJWYWx1ZXNBZGRyZXNzLCB3b3JrZXJWYWx1ZUludGVyY2VwdHNBZGRyZXNzLCB3b3JrZXJWYWx1ZVNsb3Blc0FkZHJlc3MsIHBvc2l0aW9uLCBuLCB3b3JrZXJWQWRkcmVzcyk7CiAgICBwdl9waWNvbGxtX2F0dGVudGlvbl9hdHRlbmRfd2FzbShudW1IZWFkcywgbnVtS3ZIZWFkcywgd2luZG93TGVuZ3RoLCBoZWFkRGltZW5zaW9uLCB3b3JrZXJLZXlzQWRkcmVzcywgd29ya2VyS2V5SW50ZXJjZXB0c0FkZHJlc3MsIHdvcmtlcktleVNsb3Blc0FkZHJlc3MsIHdvcmtlclZhbHVlc0FkZHJlc3MsIHdvcmtlclZhbHVlSW50ZXJjZXB0c0FkZHJlc3MsIHdvcmtlclZhbHVlU2xvcGVzQWRkcmVzcywgcG9zaXRpb24sIHdvcmtlclF1ZXJ5QWRkcmVzcywgbiwgd29ya2VyT3V0cHV0QWRkcmVzcyk7CiAgICBtZW1vcnlCdWZmZXJGbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgIHZhciByZXMgPSBtZW1vcnlCdWZmZXJGbG9hdDMyLnNsaWNlKHdvcmtlck91dHB1dEFkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHdvcmtlck91dHB1dEFkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKyBsZW5ndGgpOwogICAgZnJlZSh3b3JrZXJRQWRkcmVzcyk7CiAgICBmcmVlKHdvcmtlcktBZGRyZXNzKTsKICAgIGZyZWUod29ya2VyVkFkZHJlc3MpOwogICAgZnJlZSh3b3JrZXJPdXRwdXRBZGRyZXNzKTsKICAgIHJldHVybiByZXM7CiAgfTsKICB2YXIgcHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uTWFwID0gX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uLkFUVEVOVElPTl9QUkVDT01QVVRFX0VOQ09ESU5HLCBhdHRlbnRpb25QcmVjb21wdXRlRW5jb2RpbmcpLCBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb24uQVRURU5USU9OX0FUVEVORF9DT01CSU5FRCwgYXR0ZW50aW9uQXR0ZW5kQ29tYmluZWQpOwoKICAvKiBlc2xpbnQgY2FtZWxjYXNlOiAwICovCiAgdmFyIFB2UGljb2xsbVdlaWdodEFjdGlvbjsKICAoZnVuY3Rpb24gKFB2UGljb2xsbVdlaWdodEFjdGlvbikgewogICAgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uW1B2UGljb2xsbVdlaWdodEFjdGlvblsiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfUFJFUFJPQ0VTU19CTE9DS1MiXSA9IDEwMF0gPSAiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfUFJFUFJPQ0VTU19CTE9DS1MiOwogICAgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uW1B2UGljb2xsbVdlaWdodEFjdGlvblsiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfUFJFUFJPQ0VTU19NRVRBUyJdID0gMTAxXSA9ICJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9QUkVQUk9DRVNTX01FVEFTIjsKICAgIFB2UGljb2xsbVdlaWdodEFjdGlvbltQdlBpY29sbG1XZWlnaHRBY3Rpb25bIldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X1BSRVBST0NFU1NfQklBUyJdID0gMTAyXSA9ICJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9QUkVQUk9DRVNTX0JJQVMiOwogICAgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uW1B2UGljb2xsbVdlaWdodEFjdGlvblsiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfRk9SV0FSRF9TSU5HTEUiXSA9IDEwM10gPSAiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfRk9SV0FSRF9TSU5HTEUiOwogICAgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uW1B2UGljb2xsbVdlaWdodEFjdGlvblsiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfRk9SV0FSRF9NVUxUSVBMRSJdID0gMTA0XSA9ICJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9GT1JXQVJEX01VTFRJUExFIjsKICB9KShQdlBpY29sbG1XZWlnaHRBY3Rpb24gfHwgKFB2UGljb2xsbVdlaWdodEFjdGlvbiA9IHt9KSk7CgogIHZhciB3ZWlnaHRCbG9ja01peGVkMTZ4OFByZXByb2Nlc3NCbG9ja3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoZGF0YSkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFscywgZXhwb3J0cywgbWVtQWxsb2MsIG1lbW9yeSwgc2hhcGUsIGJpdERlcHRocywgYml0RGVwdGhTdGFydHMsIG51bUJsb2NrQnl0ZXMsIGJsb2Nrc0FkZHJlc3MsIGJsb2NrLCBhbGlnbmVkX2FsbG9jLCBmcmVlLCBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X3ByZXByb2Nlc3NfYmxvY2tzLCB3b3JrZXJCbG9ja3NBZGRyZXNzLCBzaGFwZUFkZHJlc3MsIGJpdERlcHRoc0FkZHJlc3MsIGJpdERlcHRoc1N0YXJ0QWRkcmVzcywgbWVtb3J5QnVmZmVyVWludDgsIG1lbW9yeUJ1ZmZlckludDMyOwogICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBfZGF0YSRnbG9iYWxzID0gZGF0YS5nbG9iYWxzLCBleHBvcnRzID0gX2RhdGEkZ2xvYmFscy5leHBvcnRzLCBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMubWVtQWxsb2MsIG1lbW9yeSA9IF9kYXRhJGdsb2JhbHMubWVtb3J5OwogICAgICAgICAgICBzaGFwZSA9IGRhdGEuc2hhcGUsIGJpdERlcHRocyA9IGRhdGEuYml0RGVwdGhzLCBiaXREZXB0aFN0YXJ0cyA9IGRhdGEuYml0RGVwdGhTdGFydHMsIG51bUJsb2NrQnl0ZXMgPSBkYXRhLm51bUJsb2NrQnl0ZXMsIGJsb2Nrc0FkZHJlc3MgPSBkYXRhLmJsb2Nrc0FkZHJlc3MsIGJsb2NrID0gZGF0YS5ibG9jazsKICAgICAgICAgICAgYWxpZ25lZF9hbGxvYyA9IGV4cG9ydHMuYWxpZ25lZF9hbGxvYywgZnJlZSA9IGV4cG9ydHMuZnJlZSwgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9wcmVwcm9jZXNzX2Jsb2NrcyA9IGV4cG9ydHMucHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9wcmVwcm9jZXNzX2Jsb2NrczsKICAgICAgICAgICAgd29ya2VyQmxvY2tzQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgbnVtQmxvY2tCeXRlcyAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICBpZiAod29ya2VyQmxvY2tzQWRkcmVzcykgewogICAgICAgICAgICAgIG1lbUFsbG9jLnNldChibG9ja3NBZGRyZXNzLCB7CiAgICAgICAgICAgICAgICBhbGxvY1NpemU6IG51bUJsb2NrQnl0ZXMsCiAgICAgICAgICAgICAgICB3b3JrZXJNZW1BZGRyZXNzOiB3b3JrZXJCbG9ja3NBZGRyZXNzCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgc2hhcGVBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogc2hhcGUubGVuZ3RoKTsKICAgICAgICAgICAgICBiaXREZXB0aHNBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogYml0RGVwdGhzLmxlbmd0aCk7CiAgICAgICAgICAgICAgYml0RGVwdGhzU3RhcnRBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogYml0RGVwdGhTdGFydHMubGVuZ3RoKTsKICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyID0gbmV3IEludDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDguc2V0KGJsb2NrLCB3b3JrZXJCbG9ja3NBZGRyZXNzKTsKICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoc2hhcGUsIHNoYXBlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChiaXREZXB0aHMsIGJpdERlcHRoc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhTdGFydHMsIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICAgIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfcHJlcHJvY2Vzc19ibG9ja3Moc2hhcGVBZGRyZXNzLCBiaXREZXB0aHMubGVuZ3RoLCBiaXREZXB0aHNBZGRyZXNzLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIHdvcmtlckJsb2Nrc0FkZHJlc3MpOwogICAgICAgICAgICAgIGZyZWUoc2hhcGVBZGRyZXNzKTsKICAgICAgICAgICAgICBmcmVlKGJpdERlcHRoc0FkZHJlc3MpOwogICAgICAgICAgICAgIGZyZWUoYml0RGVwdGhzU3RhcnRBZGRyZXNzKTsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUpOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIHdlaWdodEJsb2NrTWl4ZWQxNng4UHJlcHJvY2Vzc0Jsb2NrcyhfeCkgewogICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgdmFyIHdlaWdodEJsb2NrTWl4ZWQxNng4UHJlcHJvY2Vzc01ldGFzID0gZnVuY3Rpb24gd2VpZ2h0QmxvY2tNaXhlZDE2eDhQcmVwcm9jZXNzTWV0YXMoZGF0YSkgewogICAgdmFyIF9kYXRhJGdsb2JhbHMyID0gZGF0YS5nbG9iYWxzLAogICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczIuZXhwb3J0cywKICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzMi5tZW1BbGxvYywKICAgICAgbWVtb3J5ID0gX2RhdGEkZ2xvYmFsczIubWVtb3J5OwogICAgdmFyIG1lbUFkZHJlc3MgPSBkYXRhLm1lbUFkZHJlc3MsCiAgICAgIG1ldGFzID0gZGF0YS5tZXRhczsKICAgIHZhciBhbGlnbmVkX2FsbG9jID0gZXhwb3J0cy5hbGlnbmVkX2FsbG9jOwogICAgdmFyIHdvcmtlck1ldGFzQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoVWludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIG1ldGFzLmxlbmd0aCAqIFVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgIGlmICh3b3JrZXJNZXRhc0FkZHJlc3MpIHsKICAgICAgbWVtQWxsb2Muc2V0KG1lbUFkZHJlc3MsIHsKICAgICAgICBhbGxvY1NpemU6IG1ldGFzLmxlbmd0aCAqIFVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULAogICAgICAgIHdvcmtlck1lbUFkZHJlc3M6IHdvcmtlck1ldGFzQWRkcmVzcwogICAgICB9KTsKICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQxNiA9IG5ldyBVaW50MTZBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgbWVtb3J5QnVmZmVyVWludDE2LnNldChtZXRhcywgd29ya2VyTWV0YXNBZGRyZXNzIC8gVWludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgfQogIH07CiAgdmFyIHdlaWdodEJsb2NrTWl4ZWQxNng4UHJlcHJvY2Vzc0JpYXMgPSBmdW5jdGlvbiB3ZWlnaHRCbG9ja01peGVkMTZ4OFByZXByb2Nlc3NCaWFzKGRhdGEpIHsKICAgIHZhciBfZGF0YSRnbG9iYWxzMyA9IGRhdGEuZ2xvYmFscywKICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMzLmV4cG9ydHMsCiAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFsczMubWVtQWxsb2MsCiAgICAgIG1lbW9yeSA9IF9kYXRhJGdsb2JhbHMzLm1lbW9yeTsKICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzLAogICAgICBiaWFzID0gZGF0YS5iaWFzOwogICAgdmFyIGFsaWduZWRfYWxsb2MgPSBleHBvcnRzLmFsaWduZWRfYWxsb2M7CiAgICB2YXIgd29ya2VyQmlhc0FkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgYmlhcy5sZW5ndGggKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgaWYgKHdvcmtlckJpYXNBZGRyZXNzKSB7CiAgICAgIG1lbUFsbG9jLnNldChtZW1BZGRyZXNzLCB7CiAgICAgICAgYWxsb2NTaXplOiBiaWFzLmxlbmd0aCAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwKICAgICAgICB3b3JrZXJNZW1BZGRyZXNzOiB3b3JrZXJCaWFzQWRkcmVzcwogICAgICB9KTsKICAgICAgdmFyIG1lbW9yeUJ1ZmZlckZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICBtZW1vcnlCdWZmZXJGbG9hdDMyLnNldChiaWFzLCB3b3JrZXJCaWFzQWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICB9CiAgfTsKICB2YXIgd2VpZ2h0QmxvY2tNaXhlZDE2eDhGb3J3YXJkU2luZ2xlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoZGF0YSkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczQsIGV4cG9ydHMsIG1lbUFsbG9jLCBtZW1vcnksIHNoYXBlLCBpbmRpY2VzQWRkcmVzcywgYml0RGVwdGhTdGFydHMsIGJpdERlcHRocywgbWV0YXNBZGRyZXNzLCBibG9ja3NBZGRyZXNzLCB4T2Zmc2V0LCB4QnVmZmVyLCBiaWFzQWRkcmVzcywgYWxpZ25lZF9hbGxvYywgZnJlZSwgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9mb3J3YXJkX3NpbmdsZSwgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9hZGRfYmlhcywgX21lbUFsbG9jJGdldCwgd29ya2VySW5kaWNlc0FkZHJlc3MsIF9tZW1BbGxvYyRnZXQyLCB3b3JrZXJNZXRhc0FkZHJlc3MsIF9tZW1BbGxvYyRnZXQzLCB3b3JrZXJCbG9ja3NBZGRyZXNzLCBzaGFwZUFkZHJlc3MsIGJpdERlcHRoc1N0YXJ0QWRkcmVzcywgYml0RGVwdGhzQWRkcmVzcywgd29ya2VyWEFkZHJlc3MsIHdvcmtlcllBZGRyZXNzLCBtZW1vcnlCdWZmZXJGbG9hdDMyLCBtZW1vcnlCdWZmZXJJbnQzMiwgX21lbUFsbG9jJGdldDQsIHdvcmtlckJpYXNBZGRyZXNzLCBhbGxvY1NpemUsIGRpbWVuc2lvbiwgcmVzOwogICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSQxLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgX2RhdGEkZ2xvYmFsczQgPSBkYXRhLmdsb2JhbHMsIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzNC5leHBvcnRzLCBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHM0Lm1lbUFsbG9jLCBtZW1vcnkgPSBfZGF0YSRnbG9iYWxzNC5tZW1vcnk7CiAgICAgICAgICAgIHNoYXBlID0gZGF0YS5zaGFwZSwgaW5kaWNlc0FkZHJlc3MgPSBkYXRhLmluZGljZXNBZGRyZXNzLCBiaXREZXB0aFN0YXJ0cyA9IGRhdGEuYml0RGVwdGhTdGFydHMsIGJpdERlcHRocyA9IGRhdGEuYml0RGVwdGhzLCBtZXRhc0FkZHJlc3MgPSBkYXRhLm1ldGFzQWRkcmVzcywgYmxvY2tzQWRkcmVzcyA9IGRhdGEuYmxvY2tzQWRkcmVzcywgeE9mZnNldCA9IGRhdGEueE9mZnNldCwgeEJ1ZmZlciA9IGRhdGEueEJ1ZmZlciwgYmlhc0FkZHJlc3MgPSBkYXRhLmJpYXNBZGRyZXNzOwogICAgICAgICAgICBhbGlnbmVkX2FsbG9jID0gZXhwb3J0cy5hbGlnbmVkX2FsbG9jLCBmcmVlID0gZXhwb3J0cy5mcmVlLCBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2ZvcndhcmRfc2luZ2xlID0gZXhwb3J0cy5wdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2ZvcndhcmRfc2luZ2xlLCBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2FkZF9iaWFzID0gZXhwb3J0cy5wdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2FkZF9iaWFzOwogICAgICAgICAgICBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KGluZGljZXNBZGRyZXNzKSwgd29ya2VySW5kaWNlc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgICAgICAgIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KG1ldGFzQWRkcmVzcyksIHdvcmtlck1ldGFzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgICAgICAgIF9tZW1BbGxvYyRnZXQzID0gbWVtQWxsb2MuZ2V0KGJsb2Nrc0FkZHJlc3MpLCB3b3JrZXJCbG9ja3NBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgICAgICAgc2hhcGVBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogc2hhcGUubGVuZ3RoKTsKICAgICAgICAgICAgYml0RGVwdGhzU3RhcnRBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogYml0RGVwdGhTdGFydHMubGVuZ3RoKTsKICAgICAgICAgICAgYml0RGVwdGhzQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGJpdERlcHRocy5sZW5ndGgpOwogICAgICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoMjU2LCBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiB4QnVmZmVyLmxlbmd0aCk7CiAgICAgICAgICAgIHdvcmtlcllBZGRyZXNzID0gYWxpZ25lZF9hbGxvYygyNTYsIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIHNoYXBlWzBdKTsKICAgICAgICAgICAgbWVtb3J5QnVmZmVyRmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyID0gbmV3IEludDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChzaGFwZSwgc2hhcGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChiaXREZXB0aFN0YXJ0cywgYml0RGVwdGhzU3RhcnRBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChiaXREZXB0aHMsIGJpdERlcHRoc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgbWVtb3J5QnVmZmVyRmxvYXQzMi5zZXQoeEJ1ZmZlciwgd29ya2VyWEFkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2ZvcndhcmRfc2luZ2xlKHNoYXBlQWRkcmVzcywgd29ya2VySW5kaWNlc0FkZHJlc3MsIGJpdERlcHRocy5sZW5ndGgsIGJpdERlcHRoc1N0YXJ0QWRkcmVzcywgYml0RGVwdGhzQWRkcmVzcywgd29ya2VyTWV0YXNBZGRyZXNzLCB3b3JrZXJCbG9ja3NBZGRyZXNzLCB3b3JrZXJYQWRkcmVzcyArIHhPZmZzZXQsIHdvcmtlcllBZGRyZXNzKTsKICAgICAgICAgICAgaWYgKG1lbUFsbG9jLmhhcyhiaWFzQWRkcmVzcykpIHsKICAgICAgICAgICAgICBfbWVtQWxsb2MkZ2V0NCA9IG1lbUFsbG9jLmdldChiaWFzQWRkcmVzcyksIHdvcmtlckJpYXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDQud29ya2VyTWVtQWRkcmVzcywgYWxsb2NTaXplID0gX21lbUFsbG9jJGdldDQuYWxsb2NTaXplOwogICAgICAgICAgICAgIGRpbWVuc2lvbiA9IGFsbG9jU2l6ZSAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsKICAgICAgICAgICAgICBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2FkZF9iaWFzKDEsIGRpbWVuc2lvbiwgd29ya2VyWUFkZHJlc3MsIHdvcmtlckJpYXNBZGRyZXNzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXMgPSBuZXcgRmxvYXQzMkFycmF5KG1lbW9yeS5idWZmZXIpLnNsaWNlKHdvcmtlcllBZGRyZXNzIC8gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCB3b3JrZXJZQWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCArIHNoYXBlWzBdKTsKICAgICAgICAgICAgZnJlZShzaGFwZUFkZHJlc3MpOwogICAgICAgICAgICBmcmVlKGJpdERlcHRoc1N0YXJ0QWRkcmVzcyk7CiAgICAgICAgICAgIGZyZWUoYml0RGVwdGhzQWRkcmVzcyk7CiAgICAgICAgICAgIGZyZWUod29ya2VyWEFkZHJlc3MpOwogICAgICAgICAgICBmcmVlKHdvcmtlcllBZGRyZXNzKTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIsIHJlcyk7CiAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlMik7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gd2VpZ2h0QmxvY2tNaXhlZDE2eDhGb3J3YXJkU2luZ2xlKF94MikgewogICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwogIHZhciB3ZWlnaHRCbG9ja01peGVkMTZ4OEZvcndhcmRNdWx0aXBsZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKGRhdGEpIHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHM1LCBleHBvcnRzLCBtZW1BbGxvYywgbWVtb3J5LCBzaGFwZSwgaW5kaWNlc0FkZHJlc3MsIGJpdERlcHRoU3RhcnRzLCBiaXREZXB0aHMsIG1ldGFzQWRkcmVzcywgYmxvY2tzQWRkcmVzcywgbiwgeE9mZnNldCwgeEJ1ZmZlciwgYmlhc0FkZHJlc3MsIGFsaWduZWRfYWxsb2MsIGZyZWUsIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfZm9yd2FyZF9tdWx0aXBsZSwgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9hZGRfYmlhcywgX21lbUFsbG9jJGdldDUsIHdvcmtlckluZGljZXNBZGRyZXNzLCBfbWVtQWxsb2MkZ2V0Niwgd29ya2VyTWV0YXNBZGRyZXNzLCBfbWVtQWxsb2MkZ2V0Nywgd29ya2VyQmxvY2tzQWRkcmVzcywgc2hhcGVBZGRyZXNzLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIGJpdERlcHRoc0FkZHJlc3MsIHdvcmtlclhBZGRyZXNzLCB3b3JrZXJZQWRkcmVzcywgbWVtb3J5QnVmZmVyRmxvYXQzMiwgbWVtb3J5QnVmZmVySW50MzIsIF9tZW1BbGxvYyRnZXQ4LCB3b3JrZXJCaWFzQWRkcmVzcywgYWxsb2NTaXplLCBkaW1lbnNpb24sIHJlczsKICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIF9kYXRhJGdsb2JhbHM1ID0gZGF0YS5nbG9iYWxzLCBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczUuZXhwb3J0cywgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzNS5tZW1BbGxvYywgbWVtb3J5ID0gX2RhdGEkZ2xvYmFsczUubWVtb3J5OwogICAgICAgICAgICBzaGFwZSA9IGRhdGEuc2hhcGUsIGluZGljZXNBZGRyZXNzID0gZGF0YS5pbmRpY2VzQWRkcmVzcywgYml0RGVwdGhTdGFydHMgPSBkYXRhLmJpdERlcHRoU3RhcnRzLCBiaXREZXB0aHMgPSBkYXRhLmJpdERlcHRocywgbWV0YXNBZGRyZXNzID0gZGF0YS5tZXRhc0FkZHJlc3MsIGJsb2Nrc0FkZHJlc3MgPSBkYXRhLmJsb2Nrc0FkZHJlc3MsIG4gPSBkYXRhLm4sIHhPZmZzZXQgPSBkYXRhLnhPZmZzZXQsIHhCdWZmZXIgPSBkYXRhLnhCdWZmZXIsIGJpYXNBZGRyZXNzID0gZGF0YS5iaWFzQWRkcmVzczsKICAgICAgICAgICAgYWxpZ25lZF9hbGxvYyA9IGV4cG9ydHMuYWxpZ25lZF9hbGxvYywgZnJlZSA9IGV4cG9ydHMuZnJlZSwgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9mb3J3YXJkX211bHRpcGxlID0gZXhwb3J0cy5wdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2ZvcndhcmRfbXVsdGlwbGUsIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfYWRkX2JpYXMgPSBleHBvcnRzLnB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfYWRkX2JpYXM7CiAgICAgICAgICAgIF9tZW1BbGxvYyRnZXQ1ID0gbWVtQWxsb2MuZ2V0KGluZGljZXNBZGRyZXNzKSwgd29ya2VySW5kaWNlc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NS53b3JrZXJNZW1BZGRyZXNzOwogICAgICAgICAgICBfbWVtQWxsb2MkZ2V0NiA9IG1lbUFsbG9jLmdldChtZXRhc0FkZHJlc3MpLCB3b3JrZXJNZXRhc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Ni53b3JrZXJNZW1BZGRyZXNzOwogICAgICAgICAgICBfbWVtQWxsb2MkZ2V0NyA9IG1lbUFsbG9jLmdldChibG9ja3NBZGRyZXNzKSwgd29ya2VyQmxvY2tzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ3Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgICAgICAgIHNoYXBlQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIHNoYXBlLmxlbmd0aCk7CiAgICAgICAgICAgIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGJpdERlcHRoU3RhcnRzLmxlbmd0aCk7CiAgICAgICAgICAgIGJpdERlcHRoc0FkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBiaXREZXB0aHMubGVuZ3RoKTsKICAgICAgICAgICAgd29ya2VyWEFkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogeEJ1ZmZlci5sZW5ndGgpOwogICAgICAgICAgICB3b3JrZXJZQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiAoc2hhcGVbMF0gKiBuKSk7CiAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoc2hhcGUsIHNoYXBlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhTdGFydHMsIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhzLCBiaXREZXB0aHNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckZsb2F0MzIuc2V0KHhCdWZmZXIsIHdvcmtlclhBZGRyZXNzIC8gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9mb3J3YXJkX211bHRpcGxlKHNoYXBlQWRkcmVzcywgd29ya2VySW5kaWNlc0FkZHJlc3MsIGJpdERlcHRocy5sZW5ndGgsIGJpdERlcHRoc1N0YXJ0QWRkcmVzcywgYml0RGVwdGhzQWRkcmVzcywgd29ya2VyTWV0YXNBZGRyZXNzLCB3b3JrZXJCbG9ja3NBZGRyZXNzLCBuLCB3b3JrZXJYQWRkcmVzcyArIHhPZmZzZXQsIHdvcmtlcllBZGRyZXNzKTsKICAgICAgICAgICAgaWYgKG1lbUFsbG9jLmhhcyhiaWFzQWRkcmVzcykpIHsKICAgICAgICAgICAgICBfbWVtQWxsb2MkZ2V0OCA9IG1lbUFsbG9jLmdldChiaWFzQWRkcmVzcyksIHdvcmtlckJpYXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDgud29ya2VyTWVtQWRkcmVzcywgYWxsb2NTaXplID0gX21lbUFsbG9jJGdldDguYWxsb2NTaXplOwogICAgICAgICAgICAgIGRpbWVuc2lvbiA9IGFsbG9jU2l6ZSAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsKICAgICAgICAgICAgICBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2FkZF9iaWFzKG4sIGRpbWVuc2lvbiwgd29ya2VyWUFkZHJlc3MsIHdvcmtlckJpYXNBZGRyZXNzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXMgPSBuZXcgRmxvYXQzMkFycmF5KG1lbW9yeS5idWZmZXIpLnNsaWNlKHdvcmtlcllBZGRyZXNzIC8gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCB3b3JrZXJZQWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCArIHNoYXBlWzBdICogbik7CiAgICAgICAgICAgIGZyZWUoc2hhcGVBZGRyZXNzKTsKICAgICAgICAgICAgZnJlZShiaXREZXB0aHNTdGFydEFkZHJlc3MpOwogICAgICAgICAgICBmcmVlKGJpdERlcHRoc0FkZHJlc3MpOwogICAgICAgICAgICBmcmVlKHdvcmtlclhBZGRyZXNzKTsKICAgICAgICAgICAgZnJlZSh3b3JrZXJZQWRkcmVzcyk7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCByZXMpOwogICAgICAgICAgY2FzZSAyNjoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTMpOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIHdlaWdodEJsb2NrTWl4ZWQxNng4Rm9yd2FyZE11bHRpcGxlKF94MykgewogICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwogIHZhciBwdlBpY29sbG1XZWlnaHRBY3Rpb25NYXAgPSBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBQdlBpY29sbG1XZWlnaHRBY3Rpb24uV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfUFJFUFJPQ0VTU19CTE9DS1MsIHdlaWdodEJsb2NrTWl4ZWQxNng4UHJlcHJvY2Vzc0Jsb2NrcyksIFB2UGljb2xsbVdlaWdodEFjdGlvbi5XRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9QUkVQUk9DRVNTX01FVEFTLCB3ZWlnaHRCbG9ja01peGVkMTZ4OFByZXByb2Nlc3NNZXRhcyksIFB2UGljb2xsbVdlaWdodEFjdGlvbi5XRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9QUkVQUk9DRVNTX0JJQVMsIHdlaWdodEJsb2NrTWl4ZWQxNng4UHJlcHJvY2Vzc0JpYXMpLCBQdlBpY29sbG1XZWlnaHRBY3Rpb24uV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfRk9SV0FSRF9TSU5HTEUsIHdlaWdodEJsb2NrTWl4ZWQxNng4Rm9yd2FyZFNpbmdsZSksIFB2UGljb2xsbVdlaWdodEFjdGlvbi5XRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9GT1JXQVJEX01VTFRJUExFLCB3ZWlnaHRCbG9ja01peGVkMTZ4OEZvcndhcmRNdWx0aXBsZSk7CgogIGZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfQogIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH0KICB2YXIgZXhwb3J0cyQxOwogIHZhciBtZW1vcnk7CiAgdmFyIG1lbUFsbG9jID0gbmV3IE1hcCgpOwogIGZ1bmN0aW9uIGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KGFycmF5QnVmZmVyLCBpbmRleFN0YXJ0KSB7CiAgICB2YXIgaW5kZXhFbmQgPSBpbmRleFN0YXJ0OwogICAgd2hpbGUgKGFycmF5QnVmZmVyW2luZGV4RW5kXSAhPT0gMCkgewogICAgICBpbmRleEVuZCsrOwogICAgfQogICAgdmFyIHV0ZjhkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpOwogICAgcmV0dXJuIHV0ZjhkZWNvZGVyLmRlY29kZShhcnJheUJ1ZmZlci5zdWJhcnJheShpbmRleFN0YXJ0LCBpbmRleEVuZCkpOwogIH0KICB2YXIgZ2V0V2FzbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSh3YXNtKSB7CiAgICAgIHZhciBwdkNvbnNvbGVMb2dXYXNtLCBwdkFzc2VydFdhc20sIHB2VGltZVdhc20sIHB2RmlsZU9wZW5XYXNtLCBwdkZpbGVDbG9zZVdhc20sIHB2RmlsZVJlYWRXYXNtLCBwdkZpbGVXcml0ZVdhc20sIHB2RmlsZVNlZWtXYXNtLCBwdkZpbGVUZWxsV2FzbSwgcHZGaWxlUmVtb3ZlV2FzbSwgaW5zdGFuY2UsIGFsaWduZWRfYWxsb2MsIGFsaWduZWRBbGxvYzsKICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgcHZDb25zb2xlTG9nV2FzbSA9IGZ1bmN0aW9uIHB2Q29uc29sZUxvZ1dhc20oaW5kZXgpIHsKICAgICAgICAgICAgICBpbmRleCA9IHVuc2lnbmVkQWRkcmVzcyhpbmRleCk7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUKICAgICAgICAgICAgICBjb25zb2xlLmxvZyhhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgaW5kZXgpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZBc3NlcnRXYXNtID0gZnVuY3Rpb24gcHZBc3NlcnRXYXNtKGV4cHIsIGxpbmUsIGZpbGVOYW1lQWRkcmVzcykgewogICAgICAgICAgICAgIGZpbGVOYW1lQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlTmFtZUFkZHJlc3MpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIGlmIChleHByID09PSAwKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgZmlsZU5hbWVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYXNzZXJ0aW9uIGZhaWxlZCBhdCBsaW5lICIuY29uY2F0KGxpbmUsICIgaW4gXCIiKS5jb25jYXQoZmlsZU5hbWUsICJcIiIpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2VGltZVdhc20gPSBmdW5jdGlvbiBwdlRpbWVXYXNtKCkgewogICAgICAgICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKSAvIDEwMDA7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2RmlsZU9wZW5XYXNtID0gZnVuY3Rpb24gcHZGaWxlT3Blbldhc20oZmlsZUFkZHJlc3MsIHBhdGhBZGRyZXNzLCBtb2RlQWRkcmVzcywgc3RhdHVzQWRkcmVzcykgewogICAgICAgICAgICAgIGZpbGVBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICBwYXRoQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhwYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgbW9kZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MobW9kZUFkZHJlc3MpOwogICAgICAgICAgICAgIHN0YXR1c0FkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3Moc3RhdHVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlckludDMyID0gbmV3IEludDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgdmFyIHBhdGggPSBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChtZW1vcnlCdWZmZXJVaW50OCwgcGF0aEFkZHJlc3MpOwogICAgICAgICAgICAgIHZhciBtb2RlID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIG1vZGVBZGRyZXNzKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0ub3BlbihwYXRoLCBtb2RlKTsKICAgICAgICAgICAgICAgIFB2RmlsZU1lbS5zZXRQdHIoZmlsZUFkZHJlc3MsIGZpbGUpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gMDsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAtMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2RmlsZUNsb3NlV2FzbSA9IGZ1bmN0aW9uIHB2RmlsZUNsb3NlV2FzbShmaWxlQWRkcmVzcywgc3RhdHVzQWRkcmVzcykgewogICAgICAgICAgICAgIGZpbGVBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICBzdGF0dXNBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKHN0YXR1c0FkZHJlc3MpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZU1lbS5nZXRQdHIoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gMDsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAtMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2RmlsZVJlYWRXYXNtID0gZnVuY3Rpb24gcHZGaWxlUmVhZFdhc20oZmlsZUFkZHJlc3MsIGNvbnRlbnRBZGRyZXNzLCBzaXplLCBjb3VudCwgbnVtUmVhZEFkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgY29udGVudEFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoY29udGVudEFkZHJlc3MpOwogICAgICAgICAgICAgIG51bVJlYWRBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKG51bVJlYWRBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gZmlsZS5yZWFkKHNpemUsIGNvdW50KTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4LnNldChjb250ZW50LCBjb250ZW50QWRkcmVzcyk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltudW1SZWFkQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gY29udGVudC5sZW5ndGggLyBzaXplOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW251bVJlYWRBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAtMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2RmlsZVdyaXRlV2FzbSA9IGZ1bmN0aW9uIHB2RmlsZVdyaXRlV2FzbShmaWxlQWRkcmVzcywgY29udGVudEFkZHJlc3MsIHNpemUsIGNvdW50LCBudW1Xcml0ZUFkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgY29udGVudEFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoY29udGVudEFkZHJlc3MpOwogICAgICAgICAgICAgIG51bVdyaXRlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhudW1Xcml0ZUFkZHJlc3MpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZU1lbS5nZXRQdHIoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBuZXcgVWludDhBcnJheShzaXplICogY291bnQpOwogICAgICAgICAgICAgICAgY29udGVudC5zZXQobWVtb3J5QnVmZmVyVWludDguc2xpY2UoY29udGVudEFkZHJlc3MsIGNvbnRlbnRBZGRyZXNzICsgc2l6ZSAqIGNvdW50KSwgMCk7CiAgICAgICAgICAgICAgICBmaWxlLndyaXRlKGNvbnRlbnQpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtV3JpdGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSBjb250ZW50Lmxlbmd0aCAvIHNpemU7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtV3JpdGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAxOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZGaWxlU2Vla1dhc20gPSBmdW5jdGlvbiBwdkZpbGVTZWVrV2FzbShmaWxlQWRkcmVzcywgb2Zmc2V0LCB3aGVuY2UsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgc3RhdHVzQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhzdGF0dXNBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIGZpbGUuc2VlayhvZmZzZXQsIHdoZW5jZSk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZGaWxlVGVsbFdhc20gPSBmdW5jdGlvbiBwdkZpbGVUZWxsV2FzbShmaWxlQWRkcmVzcywgb2Zmc2V0QWRkcmVzcykgewogICAgICAgICAgICAgIGZpbGVBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICBvZmZzZXRBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKG9mZnNldEFkZHJlc3MpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZU1lbS5nZXRQdHIoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb2Zmc2V0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gZmlsZS50ZWxsKCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbb2Zmc2V0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVSZW1vdmVXYXNtID0gZnVuY3Rpb24gcHZGaWxlUmVtb3ZlV2FzbShwYXRoQWRkcmVzcywgc3RhdHVzQWRkcmVzcykgewogICAgICAgICAgICAgIHBhdGhBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKHBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICBzdGF0dXNBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKHN0YXR1c0FkZHJlc3MpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHZhciBwYXRoID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0ub3BlbihwYXRoLCAidyIpOwogICAgICAgICAgICAgICAgZmlsZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7CiAgICAgICAgICAgIHJldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh3YXNtLCB7CiAgICAgICAgICAgICAgd2FzaV9zbmFwc2hvdF9wcmV2aWV3MTogd2FzaV9zbmFwc2hvdF9wcmV2aWV3MV9lbXVsYXRvciwKICAgICAgICAgICAgICBlbnY6IHsKICAgICAgICAgICAgICAgIG1lbW9yeTogbWVtb3J5LAogICAgICAgICAgICAgICAgcHZfY29uc29sZV9sb2dfd2FzbTogcHZDb25zb2xlTG9nV2FzbSwKICAgICAgICAgICAgICAgIHB2X2Fzc2VydF93YXNtOiBwdkFzc2VydFdhc20sCiAgICAgICAgICAgICAgICBwdl90aW1lX3dhc206IHB2VGltZVdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX29wZW5fd2FzbTogcHZGaWxlT3Blbldhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX2Nsb3NlX3dhc206IHB2RmlsZUNsb3NlV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfcmVhZF93YXNtOiBwdkZpbGVSZWFkV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfd3JpdGVfd2FzbTogcHZGaWxlV3JpdGVXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9zZWVrX3dhc206IHB2RmlsZVNlZWtXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV90ZWxsX3dhc206IHB2RmlsZVRlbGxXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9yZW1vdmVfd2FzbTogcHZGaWxlUmVtb3ZlV2FzbQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICBpbnN0YW5jZSA9IF9jb250ZXh0LnNlbnQuaW5zdGFuY2U7CiAgICAgICAgICAgIGFsaWduZWRfYWxsb2MgPSBpbnN0YW5jZS5leHBvcnRzLmFsaWduZWRfYWxsb2M7CiAgICAgICAgICAgIGFsaWduZWRBbGxvYyA9IGZ1bmN0aW9uIGFsaWduZWRBbGxvYyhhbGlnbm1lbnQsIHNpemUpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUKICAgICAgICAgICAgICB2YXIgcG9pbnRlciA9IGFsaWduZWRfYWxsb2MoYWxpZ25tZW50LCBzaXplKTsKICAgICAgICAgICAgICBpZiAocG9pbnRlciA8IDApIHsKICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBwb2ludGVyID4+PiAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gcG9pbnRlcjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBpbnN0YW5jZS5leHBvcnRzKSwge30sIHsKICAgICAgICAgICAgICBhbGlnbmVkX2FsbG9jOiBhbGlnbmVkQWxsb2MKICAgICAgICAgICAgfSkpOwogICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiBnZXRXYXNtKF94KSB7CiAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKICB2YXIgaW5pdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGRhdGEpIHsKICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIG1lbW9yeSA9IG5ldyBXZWJBc3NlbWJseS5NZW1vcnkoewogICAgICAgICAgICAgIGluaXRpYWw6IDQwOTYsCiAgICAgICAgICAgICAgbWF4aW11bTogNjU1MzYKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMzsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc20oZGF0YS53YXNtKTsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgZXhwb3J0cyQxID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUyKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiBpbml0KF94MikgewogICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwogIHZhciBhbGxvY01lbSA9IGZ1bmN0aW9uIGFsbG9jTWVtKGRhdGEpIHsKICAgIHZhciBzaXplID0gZGF0YS5zaXplLAogICAgICBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzOwogICAgdmFyIF9leHBvcnRzID0gZXhwb3J0cyQxLAogICAgICBhbGlnbmVkX2FsbG9jID0gX2V4cG9ydHMuYWxpZ25lZF9hbGxvYzsKICAgIGlmIChzaXplID4gMCkgewogICAgICB2YXIgd29ya2VyTWVtQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgc2l6ZSAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICBtZW1BbGxvYy5zZXQobWVtQWRkcmVzcywgewogICAgICAgIGFsbG9jU2l6ZTogc2l6ZSwKICAgICAgICB3b3JrZXJNZW1BZGRyZXNzOiB3b3JrZXJNZW1BZGRyZXNzCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIGZyZWVNZW0gPSBmdW5jdGlvbiBmcmVlTWVtKGRhdGEpIHsKICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzOwogICAgdmFyIF9leHBvcnRzMiA9IGV4cG9ydHMkMSwKICAgICAgZnJlZSA9IF9leHBvcnRzMi5mcmVlOwogICAgaWYgKG1lbUFsbG9jLmhhcyhtZW1BZGRyZXNzKSkgewogICAgICB2YXIgX21lbUFsbG9jJGdldCA9IG1lbUFsbG9jLmdldChtZW1BZGRyZXNzKSwKICAgICAgICB3b3JrZXJNZW1BZGRyZXNzID0gX21lbUFsbG9jJGdldC53b3JrZXJNZW1BZGRyZXNzOwogICAgICBmcmVlKHdvcmtlck1lbUFkZHJlc3MpOwogICAgICBtZW1BbGxvY1siZGVsZXRlIl0obWVtQWRkcmVzcyk7CiAgICB9CiAgfTsKICB2YXIgY29weVRvWHB1ID0gZnVuY3Rpb24gY29weVRvWHB1KGRhdGEpIHsKICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzLAogICAgICBvZmZzZXQgPSBkYXRhLm9mZnNldCwKICAgICAgYnVmZmVyID0gZGF0YS5idWZmZXI7CiAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQobWVtQWRkcmVzcyksCiAgICAgIHdvcmtlck1lbUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Mi53b3JrZXJNZW1BZGRyZXNzOwogICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQoYnVmZmVyLCB3b3JrZXJNZW1BZGRyZXNzICsgb2Zmc2V0KTsKICB9OwogIHZhciBjb3B5RnJvbVhwdSA9IGZ1bmN0aW9uIGNvcHlGcm9tWHB1KGRhdGEpIHsKICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzLAogICAgICBvZmZzZXQgPSBkYXRhLm9mZnNldCwKICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTsKICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldChtZW1BZGRyZXNzKSwKICAgICAgd29ya2VyTWVtQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQzLndvcmtlck1lbUFkZHJlc3M7CiAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgIHJldHVybiBtZW1vcnlCdWZmZXJVaW50OC5zbGljZSh3b3JrZXJNZW1BZGRyZXNzICsgb2Zmc2V0LCB3b3JrZXJNZW1BZGRyZXNzICsgb2Zmc2V0ICsgc2l6ZSk7CiAgfTsKICB2YXIgbWVtc2V0ID0gZnVuY3Rpb24gbWVtc2V0KGRhdGEpIHsKICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzLAogICAgICBmaWxsQnl0ZSA9IGRhdGEuZmlsbEJ5dGUsCiAgICAgIHNpemUgPSBkYXRhLnNpemU7CiAgICBpZiAobWVtQWxsb2MuaGFzKG1lbUFkZHJlc3MpKSB7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NCA9IG1lbUFsbG9jLmdldChtZW1BZGRyZXNzKSwKICAgICAgICB3b3JrZXJNZW1BZGRyZXNzID0gX21lbUFsbG9jJGdldDQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4LmZpbGwoZmlsbEJ5dGUsIHdvcmtlck1lbUFkZHJlc3MsIHdvcmtlck1lbUFkZHJlc3MgKyBzaXplKTsKICAgIH0KICB9OwogIHZhciB0aW1lclN0YXJ0ID0gZnVuY3Rpb24gdGltZXJTdGFydChkYXRhKSB7CiAgICB2YXIgd29ya2VySW5kZXggPSBkYXRhLndvcmtlckluZGV4OwogICAgdmFyIF9leHBvcnRzMyA9IGV4cG9ydHMkMSwKICAgICAgcHZfcGljb2xsbV90aW1lcl9zdGFydF93YXNtID0gX2V4cG9ydHMzLnB2X3BpY29sbG1fdGltZXJfc3RhcnRfd2FzbTsKICAgIGlmIChwdl9waWNvbGxtX3RpbWVyX3N0YXJ0X3dhc20pIHsKICAgICAgcHZfcGljb2xsbV90aW1lcl9zdGFydF93YXNtKHdvcmtlckluZGV4KTsKICAgIH0KICB9OwogIHZhciB0aW1lclN0b3AgPSBmdW5jdGlvbiB0aW1lclN0b3AoKSB7CiAgICB2YXIgX2V4cG9ydHM0ID0gZXhwb3J0cyQxLAogICAgICBwdl9waWNvbGxtX3RpbWVyX3N0b3Bfd2FzbSA9IF9leHBvcnRzNC5wdl9waWNvbGxtX3RpbWVyX3N0b3Bfd2FzbTsKICAgIGlmIChwdl9waWNvbGxtX3RpbWVyX3N0b3Bfd2FzbSkgewogICAgICBwdl9waWNvbGxtX3RpbWVyX3N0b3Bfd2FzbSgpOwogICAgfQogIH07CiAgdmFyIHhwdUFjdGlvbk1hcCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFB2WHB1QWN0aW9uLklOSVQsIGluaXQpLCBQdlhwdUFjdGlvbi5BTExPQywgYWxsb2NNZW0pLCBQdlhwdUFjdGlvbi5GUkVFLCBmcmVlTWVtKSwgUHZYcHVBY3Rpb24uQ09QWV9UT19YUFUsIGNvcHlUb1hwdSksIFB2WHB1QWN0aW9uLkNPUFlfRlJPTV9YUFUsIGNvcHlGcm9tWHB1KSwgUHZYcHVBY3Rpb24uTUVNU0VULCBtZW1zZXQpLCBQdlhwdUFjdGlvbi5USU1FUl9TVEFSVCwgdGltZXJTdGFydCksIFB2WHB1QWN0aW9uLlRJTUVSX1NUT1AsIHRpbWVyU3RvcCksIHB2TXZtQWN0aW9uTWFwKSwgcHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uTWFwKSwgcHZQaWNvbGxtV2VpZ2h0QWN0aW9uTWFwKTsKICBzZWxmLm9ubWVzc2FnZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKGV2ZW50KSB7CiAgICAgIHZhciByZXM7CiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBpZiAoIShldmVudC5kYXRhLmFjdGlvbiBpbiB4cHVBY3Rpb25NYXApKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBldmVudC5kYXRhLmdsb2JhbHMgPSB7CiAgICAgICAgICAgICAgZXhwb3J0czogZXhwb3J0cyQxLAogICAgICAgICAgICAgIG1lbW9yeTogbWVtb3J5LAogICAgICAgICAgICAgIG1lbUFsbG9jOiBtZW1BbGxvYwogICAgICAgICAgICB9OwogICAgICAgICAgICBfY29udGV4dDMucHJldiA9IDI7CiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNTsKICAgICAgICAgICAgcmV0dXJuIHhwdUFjdGlvbk1hcFtldmVudC5kYXRhLmFjdGlvbl0oZXZlbnQuZGF0YSk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIHJlcyA9IF9jb250ZXh0My5zZW50OwogICAgICAgICAgICBpZiAocmVzKSB7CiAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgICAgICAgICAgd29ya0lkOiBldmVudC5kYXRhLndvcmtJZCwKICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzCiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICAgICAgfSwgW3Jlcy5idWZmZXJdKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdvaycsCiAgICAgICAgICAgICAgICB3b3JrSWQ6IGV2ZW50LmRhdGEud29ya0lkCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gOTsKICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gX2NvbnRleHQzWyJjYXRjaCJdKDIpOwogICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIHdvcmtJZDogZXZlbnQuZGF0YS53b3JrSWQsCiAgICAgICAgICAgICAgbWVzc2FnZTogX2NvbnRleHQzLnQwLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDE1OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdmYWlsZWQnLAogICAgICAgICAgICAgIG1lc3NhZ2U6ICJVbnJlY29nbml6ZWQgY29tbWFuZDogIi5jb25jYXQoZXZlbnQuZGF0YS5hY3Rpb24pCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxNToKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTMsIG51bGwsIFtbMiwgOV1dKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiAoX3gzKSB7CiAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7Cgp9KSgpOwoK', null, false); +var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gX3R5cGVvZiQzKG8pIHsKICAgICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7CgogICAgcmV0dXJuIF90eXBlb2YkMyA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsKICAgICAgcmV0dXJuIHR5cGVvZiBvOwogICAgfSA6IGZ1bmN0aW9uIChvKSB7CiAgICAgIHJldHVybiBvICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG87CiAgICB9LCBfdHlwZW9mJDMobyk7CiAgfQoKICBmdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7CiAgICBpZiAoIm9iamVjdCIgIT0gX3R5cGVvZiQzKHQpIHx8ICF0KSByZXR1cm4gdDsKICAgIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOwogICAgaWYgKHZvaWQgMCAhPT0gZSkgewogICAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8ICJkZWZhdWx0Iik7CiAgICAgIGlmICgib2JqZWN0IiAhPSBfdHlwZW9mJDMoaSkpIHJldHVybiBpOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogICAgfQogICAgcmV0dXJuICgic3RyaW5nIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7CiAgfQoKICBmdW5jdGlvbiB0b1Byb3BlcnR5S2V5KHQpIHsKICAgIHZhciBpID0gdG9QcmltaXRpdmUodCwgInN0cmluZyIpOwogICAgcmV0dXJuICJzeW1ib2wiID09IF90eXBlb2YkMyhpKSA/IGkgOiBTdHJpbmcoaSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7CiAgICBrZXkgPSB0b1Byb3BlcnR5S2V5KGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsKICAgIHRyeSB7CiAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsKICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHJlamVjdChlcnJvcik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpbmZvLmRvbmUpIHsKICAgICAgcmVzb2x2ZSh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgYXJncyA9IGFyZ3VtZW50czsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsKICAgICAgICB9CiAgICAgICAgX25leHQodW5kZWZpbmVkKTsKICAgICAgfSk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMkMSAoeCkgewogIAlyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4OwogIH0KCiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQyID0ge2V4cG9ydHM6IHt9fTsKCiAgdmFyIF90eXBlb2YkMiA9IHtleHBvcnRzOiB7fX07CgogIF90eXBlb2YkMi5leHBvcnRzOwoKICAoZnVuY3Rpb24gKG1vZHVsZSkgewogIAlmdW5jdGlvbiBfdHlwZW9mKG8pIHsKICAJICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAJICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsKICAJICAgIHJldHVybiB0eXBlb2YgbzsKICAJICB9IDogZnVuY3Rpb24gKG8pIHsKICAJICAgIHJldHVybiBvICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG87CiAgCSAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0cyksIF90eXBlb2Yobyk7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChfdHlwZW9mJDIpKTsKCiAgdmFyIF90eXBlb2ZFeHBvcnRzJDEgPSBfdHlwZW9mJDIuZXhwb3J0czsKCiAgcmVnZW5lcmF0b3JSdW50aW1lJDIuZXhwb3J0czsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJdmFyIF90eXBlb2YgPSBfdHlwZW9mRXhwb3J0cyQxWyJkZWZhdWx0Il07CiAgCWZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAJICAgIHJldHVybiBlOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgCSAgdmFyIHQsCiAgCSAgICBlID0ge30sCiAgCSAgICByID0gT2JqZWN0LnByb3RvdHlwZSwKICAJICAgIG4gPSByLmhhc093blByb3BlcnR5LAogIAkgICAgbyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAodCwgZSwgcikgewogIAkgICAgICB0W2VdID0gci52YWx1ZTsKICAJICAgIH0sCiAgCSAgICBpID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sID8gU3ltYm9sIDoge30sCiAgCSAgICBhID0gaS5pdGVyYXRvciB8fCAiQEBpdGVyYXRvciIsCiAgCSAgICBjID0gaS5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogIAkgICAgdSA9IGkudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZSh0LCBlLCByKSB7CiAgCSAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIHsKICAJICAgICAgdmFsdWU6IHIsCiAgCSAgICAgIGVudW1lcmFibGU6ICEwLAogIAkgICAgICBjb25maWd1cmFibGU6ICEwLAogIAkgICAgICB3cml0YWJsZTogITAKICAJICAgIH0pLCB0W2VdOwogIAkgIH0KICAJICB0cnkgewogIAkgICAgZGVmaW5lKHt9LCAiIik7CiAgCSAgfSBjYXRjaCAodCkgewogIAkgICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHQsIGUsIHIpIHsKICAJICAgICAgcmV0dXJuIHRbZV0gPSByOwogIAkgICAgfTsKICAJICB9CiAgCSAgZnVuY3Rpb24gd3JhcCh0LCBlLCByLCBuKSB7CiAgCSAgICB2YXIgaSA9IGUgJiYgZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBlIDogR2VuZXJhdG9yLAogIAkgICAgICBhID0gT2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSksCiAgCSAgICAgIGMgPSBuZXcgQ29udGV4dChuIHx8IFtdKTsKICAJICAgIHJldHVybiBvKGEsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZCh0LCByLCBjKQogIAkgICAgfSksIGE7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHRyeUNhdGNoKHQsIGUsIHIpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiB0LmNhbGwoZSwgcikKICAJICAgICAgfTsKICAJICAgIH0gY2F0Y2ggKHQpIHsKICAJICAgICAgcmV0dXJuIHsKICAJICAgICAgICB0eXBlOiAidGhyb3ciLAogIAkgICAgICAgIGFyZzogdAogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBlLndyYXAgPSB3cmFwOwogIAkgIHZhciBoID0gInN1c3BlbmRlZFN0YXJ0IiwKICAJICAgIGwgPSAic3VzcGVuZGVkWWllbGQiLAogIAkgICAgZiA9ICJleGVjdXRpbmciLAogIAkgICAgcyA9ICJjb21wbGV0ZWQiLAogIAkgICAgeSA9IHt9OwogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fQogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAJICB2YXIgcCA9IHt9OwogIAkgIGRlZmluZShwLCBhLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KTsKICAJICB2YXIgZCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIHYgPSBkICYmIGQoZCh2YWx1ZXMoW10pKSk7CiAgCSAgdiAmJiB2ICE9PSByICYmIG4uY2FsbCh2LCBhKSAmJiAocCA9IHYpOwogIAkgIHZhciBnID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocCk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHQpIHsKICAJICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgCSAgICAgIGRlZmluZSh0LCBlLCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UoZSwgdCk7CiAgCSAgICAgIH0pOwogIAkgICAgfSk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IodCwgZSkgewogIAkgICAgZnVuY3Rpb24gaW52b2tlKHIsIG8sIGksIGEpIHsKICAJICAgICAgdmFyIGMgPSB0cnlDYXRjaCh0W3JdLCB0LCBvKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IGMudHlwZSkgewogIAkgICAgICAgIHZhciB1ID0gYy5hcmcsCiAgCSAgICAgICAgICBoID0gdS52YWx1ZTsKICAJICAgICAgICByZXR1cm4gaCAmJiAib2JqZWN0IiA9PSBfdHlwZW9mKGgpICYmIG4uY2FsbChoLCAiX19hd2FpdCIpID8gZS5yZXNvbHZlKGguX19hd2FpdCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgaW52b2tlKCJuZXh0IiwgdCwgaSwgYSk7CiAgCSAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHsKICAJICAgICAgICAgIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KSA6IGUucmVzb2x2ZShoKS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgCSAgICAgICAgICB1LnZhbHVlID0gdCwgaSh1KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KTsKICAJICAgICAgfQogIAkgICAgICBhKGMuYXJnKTsKICAJICAgIH0KICAJICAgIHZhciByOwogIAkgICAgbyh0aGlzLCAiX2ludm9rZSIsIHsKICAJICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHQsIG4pIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSwgcikgewogIAkgICAgICAgICAgICBpbnZva2UodCwgbiwgZSwgcik7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHIgPSByID8gci50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChlLCByLCBuKSB7CiAgCSAgICB2YXIgbyA9IGg7CiAgCSAgICByZXR1cm4gZnVuY3Rpb24gKGksIGEpIHsKICAJICAgICAgaWYgKG8gPT09IGYpIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogIAkgICAgICBpZiAobyA9PT0gcykgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBpKSB0aHJvdyBhOwogIAkgICAgICAgIHJldHVybiB7CiAgCSAgICAgICAgICB2YWx1ZTogdCwKICAJICAgICAgICAgIGRvbmU6ICEwCiAgCSAgICAgICAgfTsKICAJICAgICAgfQogIAkgICAgICBmb3IgKG4ubWV0aG9kID0gaSwgbi5hcmcgPSBhOzspIHsKICAJICAgICAgICB2YXIgYyA9IG4uZGVsZWdhdGU7CiAgCSAgICAgICAgaWYgKGMpIHsKICAJICAgICAgICAgIHZhciB1ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShjLCBuKTsKICAJICAgICAgICAgIGlmICh1KSB7CiAgCSAgICAgICAgICAgIGlmICh1ID09PSB5KSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIHU7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICAgIGlmICgibmV4dCIgPT09IG4ubWV0aG9kKSBuLnNlbnQgPSBuLl9zZW50ID0gbi5hcmc7ZWxzZSBpZiAoInRocm93IiA9PT0gbi5tZXRob2QpIHsKICAJICAgICAgICAgIGlmIChvID09PSBoKSB0aHJvdyBvID0gcywgbi5hcmc7CiAgCSAgICAgICAgICBuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKTsKICAJICAgICAgICB9IGVsc2UgInJldHVybiIgPT09IG4ubWV0aG9kICYmIG4uYWJydXB0KCJyZXR1cm4iLCBuLmFyZyk7CiAgCSAgICAgICAgbyA9IGY7CiAgCSAgICAgICAgdmFyIHAgPSB0cnlDYXRjaChlLCByLCBuKTsKICAJICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHAudHlwZSkgewogIAkgICAgICAgICAgaWYgKG8gPSBuLmRvbmUgPyBzIDogbCwgcC5hcmcgPT09IHkpIGNvbnRpbnVlOwogIAkgICAgICAgICAgcmV0dXJuIHsKICAJICAgICAgICAgICAgdmFsdWU6IHAuYXJnLAogIAkgICAgICAgICAgICBkb25lOiBuLmRvbmUKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgfQogIAkgICAgICAgICJ0aHJvdyIgPT09IHAudHlwZSAmJiAobyA9IHMsIG4ubWV0aG9kID0gInRocm93Iiwgbi5hcmcgPSBwLmFyZyk7CiAgCSAgICAgIH0KICAJICAgIH07CiAgCSAgfQogIAkgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgcikgewogIAkgICAgdmFyIG4gPSByLm1ldGhvZCwKICAJICAgICAgbyA9IGUuaXRlcmF0b3Jbbl07CiAgCSAgICBpZiAobyA9PT0gdCkgcmV0dXJuIHIuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBuICYmIGUuaXRlcmF0b3JbInJldHVybiJdICYmIChyLm1ldGhvZCA9ICJyZXR1cm4iLCByLmFyZyA9IHQsIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgciksICJ0aHJvdyIgPT09IHIubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbiAmJiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBuICsgIicgbWV0aG9kIikpLCB5OwogIAkgICAgdmFyIGkgPSB0cnlDYXRjaChvLCBlLml0ZXJhdG9yLCByLmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gaS50eXBlKSByZXR1cm4gci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IGkuYXJnLCByLmRlbGVnYXRlID0gbnVsbCwgeTsKICAJICAgIHZhciBhID0gaS5hcmc7CiAgCSAgICByZXR1cm4gYSA/IGEuZG9uZSA/IChyW2UucmVzdWx0TmFtZV0gPSBhLnZhbHVlLCByLm5leHQgPSBlLm5leHRMb2MsICJyZXR1cm4iICE9PSByLm1ldGhvZCAmJiAoci5tZXRob2QgPSAibmV4dCIsIHIuYXJnID0gdCksIHIuZGVsZWdhdGUgPSBudWxsLCB5KSA6IGEgOiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksIHIuZGVsZWdhdGUgPSBudWxsLCB5KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gewogIAkgICAgICB0cnlMb2M6IHRbMF0KICAJICAgIH07CiAgCSAgICAxIGluIHQgJiYgKGUuY2F0Y2hMb2MgPSB0WzFdKSwgMiBpbiB0ICYmIChlLmZpbmFsbHlMb2MgPSB0WzJdLCBlLmFmdGVyTG9jID0gdFszXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGUpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gdC5jb21wbGV0aW9uIHx8IHt9OwogIAkgICAgZS50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSBlLmFyZywgdC5jb21wbGV0aW9uID0gZTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQ29udGV4dCh0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHQuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsKICAJICB9CiAgCSAgZnVuY3Rpb24gdmFsdWVzKGUpIHsKICAJICAgIGlmIChlIHx8ICIiID09PSBlKSB7CiAgCSAgICAgIHZhciByID0gZVthXTsKICAJICAgICAgaWYgKHIpIHJldHVybiByLmNhbGwoZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBlLm5leHQpIHJldHVybiBlOwogIAkgICAgICBpZiAoIWlzTmFOKGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBvID0gLTEsCiAgCSAgICAgICAgICBpID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsrbyA8IGUubGVuZ3RoOykgaWYgKG4uY2FsbChlLCBvKSkgcmV0dXJuIG5leHQudmFsdWUgPSBlW29dLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgcmV0dXJuIGkubmV4dCA9IGk7CiAgCSAgICAgIH0KICAJICAgIH0KICAJICAgIHRocm93IG5ldyBUeXBlRXJyb3IoX3R5cGVvZihlKSArICIgaXMgbm90IGl0ZXJhYmxlIik7CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgbyhnLCAiY29uc3RydWN0b3IiLCB7CiAgCSAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgCSAgICBjb25maWd1cmFibGU6ICEwCiAgCSAgfSksIG8oR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBlLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAodCkgewogIAkgICAgdmFyIGUgPSAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmIHQuY29uc3RydWN0b3I7CiAgCSAgICByZXR1cm4gISFlICYmIChlID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAiR2VuZXJhdG9yRnVuY3Rpb24iID09PSAoZS5kaXNwbGF5TmFtZSB8fCBlLm5hbWUpKTsKICAJICB9LCBlLm1hcmsgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZih0LCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAodC5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKHQsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpKSwgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGcpLCB0OwogIAkgIH0sIGUuYXdyYXAgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgX19hd2FpdDogdAogIAkgICAgfTsKICAJICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGMsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pLCBlLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBlLmFzeW5jID0gZnVuY3Rpb24gKHQsIHIsIG4sIG8sIGkpIHsKICAJICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFByb21pc2UpOwogIAkgICAgdmFyIGEgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKHQsIHIsIG4sIG8pLCBpKTsKICAJICAgIHJldHVybiBlLmlzR2VuZXJhdG9yRnVuY3Rpb24ocikgPyBhIDogYS5uZXh0KCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICByZXR1cm4gdC5kb25lID8gdC52YWx1ZSA6IGEubmV4dCgpOwogIAkgICAgfSk7CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKGcpLCBkZWZpbmUoZywgdSwgIkdlbmVyYXRvciIpLCBkZWZpbmUoZywgYSwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShnLCAidG9TdHJpbmciLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgCSAgfSksIGUua2V5cyA9IGZ1bmN0aW9uICh0KSB7CiAgCSAgICB2YXIgZSA9IE9iamVjdCh0KSwKICAJICAgICAgciA9IFtdOwogIAkgICAgZm9yICh2YXIgbiBpbiBlKSByLnB1c2gobik7CiAgCSAgICByZXR1cm4gci5yZXZlcnNlKCksIGZ1bmN0aW9uIG5leHQoKSB7CiAgCSAgICAgIGZvciAoOyByLmxlbmd0aDspIHsKICAJICAgICAgICB2YXIgdCA9IHIucG9wKCk7CiAgCSAgICAgICAgaWYgKHQgaW4gZSkgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGUudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KGUpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB0LCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gIm5leHQiLCB0aGlzLmFyZyA9IHQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhZSkgZm9yICh2YXIgciBpbiB0aGlzKSAidCIgPT09IHIuY2hhckF0KDApICYmIG4uY2FsbCh0aGlzLCByKSAmJiAhaXNOYU4oK3Iuc2xpY2UoMSkpICYmICh0aGlzW3JdID0gdCk7CiAgCSAgICB9LAogIAkgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAJICAgICAgdGhpcy5kb25lID0gITA7CiAgCSAgICAgIHZhciB0ID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gdGhpcy5ydmFsOwogIAkgICAgfSwKICAJICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihlKSB7CiAgCSAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGU7CiAgCSAgICAgIHZhciByID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKG4sIG8pIHsKICAJICAgICAgICByZXR1cm4gYS50eXBlID0gInRocm93IiwgYS5hcmcgPSBlLCByLm5leHQgPSBuLCBvICYmIChyLm1ldGhvZCA9ICJuZXh0Iiwgci5hcmcgPSB0KSwgISFvOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIG8gPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgbyA+PSAwOyAtLW8pIHsKICAJICAgICAgICB2YXIgaSA9IHRoaXMudHJ5RW50cmllc1tvXSwKICAJICAgICAgICAgIGEgPSBpLmNvbXBsZXRpb247CiAgCSAgICAgICAgaWYgKCJyb290IiA9PT0gaS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogIAkgICAgICAgIGlmIChpLnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBjID0gbi5jYWxsKGksICJjYXRjaExvYyIpLAogIAkgICAgICAgICAgICB1ID0gbi5jYWxsKGksICJmaW5hbGx5TG9jIik7CiAgCSAgICAgICAgICBpZiAoYyAmJiB1KSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShpLmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChjKSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghdSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgaS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGkuZmluYWxseUxvYyk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICB9CiAgCSAgICB9LAogIAkgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodCwgZSkgewogIAkgICAgICBmb3IgKHZhciByID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHIgPj0gMDsgLS1yKSB7CiAgCSAgICAgICAgdmFyIG8gPSB0aGlzLnRyeUVudHJpZXNbcl07CiAgCSAgICAgICAgaWYgKG8udHJ5TG9jIDw9IHRoaXMucHJldiAmJiBuLmNhbGwobywgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBvLmZpbmFsbHlMb2MpIHsKICAJICAgICAgICAgIHZhciBpID0gbzsKICAJICAgICAgICAgIGJyZWFrOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICBpICYmICgiYnJlYWsiID09PSB0IHx8ICJjb250aW51ZSIgPT09IHQpICYmIGkudHJ5TG9jIDw9IGUgJiYgZSA8PSBpLmZpbmFsbHlMb2MgJiYgKGkgPSBudWxsKTsKICAJICAgICAgdmFyIGEgPSBpID8gaS5jb21wbGV0aW9uIDoge307CiAgCSAgICAgIHJldHVybiBhLnR5cGUgPSB0LCBhLmFyZyA9IGUsIGkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGkuZmluYWxseUxvYywgeSkgOiB0aGlzLmNvbXBsZXRlKGEpOwogIAkgICAgfSwKICAJICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSh0LCBlKSB7CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gImJyZWFrIiA9PT0gdC50eXBlIHx8ICJjb250aW51ZSIgPT09IHQudHlwZSA/IHRoaXMubmV4dCA9IHQuYXJnIDogInJldHVybiIgPT09IHQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gdC50eXBlICYmIGUgJiYgKHRoaXMubmV4dCA9IGUpLCB5OwogIAkgICAgfSwKICAJICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKHQpIHsKICAJICAgICAgZm9yICh2YXIgZSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBlID49IDA7IC0tZSkgewogIAkgICAgICAgIHZhciByID0gdGhpcy50cnlFbnRyaWVzW2VdOwogIAkgICAgICAgIGlmIChyLmZpbmFsbHlMb2MgPT09IHQpIHJldHVybiB0aGlzLmNvbXBsZXRlKHIuY29tcGxldGlvbiwgci5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkociksIHk7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godCkgewogIAkgICAgICBmb3IgKHZhciBlID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGUgPj0gMDsgLS1lKSB7CiAgCSAgICAgICAgdmFyIHIgPSB0aGlzLnRyeUVudHJpZXNbZV07CiAgCSAgICAgICAgaWYgKHIudHJ5TG9jID09PSB0KSB7CiAgCSAgICAgICAgICB2YXIgbiA9IHIuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSBuLnR5cGUpIHsKICAJICAgICAgICAgICAgdmFyIG8gPSBuLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShyKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICAgIHJldHVybiBvOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoZSwgciwgbikgewogIAkgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAJICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGUpLAogIAkgICAgICAgIHJlc3VsdE5hbWU6IHIsCiAgCSAgICAgICAgbmV4dExvYzogbgogIAkgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHQpLCB5OwogIAkgICAgfQogIAkgIH0sIGU7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMikpOwoKICB2YXIgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyQxID0gcmVnZW5lcmF0b3JSdW50aW1lJDIuZXhwb3J0czsKCiAgLy8gVE9ETyhCYWJlbCA4KTogUmVtb3ZlIHRoaXMgZmlsZS4KCiAgdmFyIHJ1bnRpbWUkMSA9IHJlZ2VuZXJhdG9yUnVudGltZUV4cG9ydHMkMSgpOwogIHZhciByZWdlbmVyYXRvciQxID0gcnVudGltZSQxOwoKICAvLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUvcnVudGltZS5qcyNMNzM2PQogIHRyeSB7CiAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgICB9IGVsc2UgewogICAgICBGdW5jdGlvbigiciIsICJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocnVudGltZSQxKTsKICAgIH0KICB9CgogIHZhciBfcmVnZW5lcmF0b3JSdW50aW1lJDEgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMkMShyZWdlbmVyYXRvciQxKTsKCiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHsKICAJcmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDsKICB9CgogIHZhciByZWdlbmVyYXRvclJ1bnRpbWUkMSA9IHtleHBvcnRzOiB7fX07CgogIHZhciBfdHlwZW9mJDEgPSB7ZXhwb3J0czoge319OwoKICBfdHlwZW9mJDEuZXhwb3J0czsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJZnVuY3Rpb24gX3R5cGVvZihvKSB7CiAgCSAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgCSAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgInN5bWJvbCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7CiAgCSAgICByZXR1cm4gdHlwZW9mIG87CiAgCSAgfSA6IGZ1bmN0aW9uIChvKSB7CiAgCSAgICByZXR1cm4gbyAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHMpLCBfdHlwZW9mKG8pOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsgCiAgfSAoX3R5cGVvZiQxKSk7CgogIHZhciBfdHlwZW9mRXhwb3J0cyA9IF90eXBlb2YkMS5leHBvcnRzOwoKICByZWdlbmVyYXRvclJ1bnRpbWUkMS5leHBvcnRzOwoKICAoZnVuY3Rpb24gKG1vZHVsZSkgewogIAl2YXIgX3R5cGVvZiA9IF90eXBlb2ZFeHBvcnRzWyJkZWZhdWx0Il07CiAgCWZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAJICAgIHJldHVybiBlOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgCSAgdmFyIHQsCiAgCSAgICBlID0ge30sCiAgCSAgICByID0gT2JqZWN0LnByb3RvdHlwZSwKICAJICAgIG4gPSByLmhhc093blByb3BlcnR5LAogIAkgICAgbyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAodCwgZSwgcikgewogIAkgICAgICB0W2VdID0gci52YWx1ZTsKICAJICAgIH0sCiAgCSAgICBpID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sID8gU3ltYm9sIDoge30sCiAgCSAgICBhID0gaS5pdGVyYXRvciB8fCAiQEBpdGVyYXRvciIsCiAgCSAgICBjID0gaS5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogIAkgICAgdSA9IGkudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZSh0LCBlLCByKSB7CiAgCSAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIHsKICAJICAgICAgdmFsdWU6IHIsCiAgCSAgICAgIGVudW1lcmFibGU6ICEwLAogIAkgICAgICBjb25maWd1cmFibGU6ICEwLAogIAkgICAgICB3cml0YWJsZTogITAKICAJICAgIH0pLCB0W2VdOwogIAkgIH0KICAJICB0cnkgewogIAkgICAgZGVmaW5lKHt9LCAiIik7CiAgCSAgfSBjYXRjaCAodCkgewogIAkgICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHQsIGUsIHIpIHsKICAJICAgICAgcmV0dXJuIHRbZV0gPSByOwogIAkgICAgfTsKICAJICB9CiAgCSAgZnVuY3Rpb24gd3JhcCh0LCBlLCByLCBuKSB7CiAgCSAgICB2YXIgaSA9IGUgJiYgZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBlIDogR2VuZXJhdG9yLAogIAkgICAgICBhID0gT2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSksCiAgCSAgICAgIGMgPSBuZXcgQ29udGV4dChuIHx8IFtdKTsKICAJICAgIHJldHVybiBvKGEsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZCh0LCByLCBjKQogIAkgICAgfSksIGE7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHRyeUNhdGNoKHQsIGUsIHIpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiB0LmNhbGwoZSwgcikKICAJICAgICAgfTsKICAJICAgIH0gY2F0Y2ggKHQpIHsKICAJICAgICAgcmV0dXJuIHsKICAJICAgICAgICB0eXBlOiAidGhyb3ciLAogIAkgICAgICAgIGFyZzogdAogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBlLndyYXAgPSB3cmFwOwogIAkgIHZhciBoID0gInN1c3BlbmRlZFN0YXJ0IiwKICAJICAgIGwgPSAic3VzcGVuZGVkWWllbGQiLAogIAkgICAgZiA9ICJleGVjdXRpbmciLAogIAkgICAgcyA9ICJjb21wbGV0ZWQiLAogIAkgICAgeSA9IHt9OwogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fQogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAJICB2YXIgcCA9IHt9OwogIAkgIGRlZmluZShwLCBhLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KTsKICAJICB2YXIgZCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIHYgPSBkICYmIGQoZCh2YWx1ZXMoW10pKSk7CiAgCSAgdiAmJiB2ICE9PSByICYmIG4uY2FsbCh2LCBhKSAmJiAocCA9IHYpOwogIAkgIHZhciBnID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocCk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHQpIHsKICAJICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgCSAgICAgIGRlZmluZSh0LCBlLCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UoZSwgdCk7CiAgCSAgICAgIH0pOwogIAkgICAgfSk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IodCwgZSkgewogIAkgICAgZnVuY3Rpb24gaW52b2tlKHIsIG8sIGksIGEpIHsKICAJICAgICAgdmFyIGMgPSB0cnlDYXRjaCh0W3JdLCB0LCBvKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IGMudHlwZSkgewogIAkgICAgICAgIHZhciB1ID0gYy5hcmcsCiAgCSAgICAgICAgICBoID0gdS52YWx1ZTsKICAJICAgICAgICByZXR1cm4gaCAmJiAib2JqZWN0IiA9PSBfdHlwZW9mKGgpICYmIG4uY2FsbChoLCAiX19hd2FpdCIpID8gZS5yZXNvbHZlKGguX19hd2FpdCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgaW52b2tlKCJuZXh0IiwgdCwgaSwgYSk7CiAgCSAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHsKICAJICAgICAgICAgIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KSA6IGUucmVzb2x2ZShoKS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgCSAgICAgICAgICB1LnZhbHVlID0gdCwgaSh1KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KTsKICAJICAgICAgfQogIAkgICAgICBhKGMuYXJnKTsKICAJICAgIH0KICAJICAgIHZhciByOwogIAkgICAgbyh0aGlzLCAiX2ludm9rZSIsIHsKICAJICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHQsIG4pIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSwgcikgewogIAkgICAgICAgICAgICBpbnZva2UodCwgbiwgZSwgcik7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHIgPSByID8gci50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChlLCByLCBuKSB7CiAgCSAgICB2YXIgbyA9IGg7CiAgCSAgICByZXR1cm4gZnVuY3Rpb24gKGksIGEpIHsKICAJICAgICAgaWYgKG8gPT09IGYpIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogIAkgICAgICBpZiAobyA9PT0gcykgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBpKSB0aHJvdyBhOwogIAkgICAgICAgIHJldHVybiB7CiAgCSAgICAgICAgICB2YWx1ZTogdCwKICAJICAgICAgICAgIGRvbmU6ICEwCiAgCSAgICAgICAgfTsKICAJICAgICAgfQogIAkgICAgICBmb3IgKG4ubWV0aG9kID0gaSwgbi5hcmcgPSBhOzspIHsKICAJICAgICAgICB2YXIgYyA9IG4uZGVsZWdhdGU7CiAgCSAgICAgICAgaWYgKGMpIHsKICAJICAgICAgICAgIHZhciB1ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShjLCBuKTsKICAJICAgICAgICAgIGlmICh1KSB7CiAgCSAgICAgICAgICAgIGlmICh1ID09PSB5KSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIHU7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICAgIGlmICgibmV4dCIgPT09IG4ubWV0aG9kKSBuLnNlbnQgPSBuLl9zZW50ID0gbi5hcmc7ZWxzZSBpZiAoInRocm93IiA9PT0gbi5tZXRob2QpIHsKICAJICAgICAgICAgIGlmIChvID09PSBoKSB0aHJvdyBvID0gcywgbi5hcmc7CiAgCSAgICAgICAgICBuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKTsKICAJICAgICAgICB9IGVsc2UgInJldHVybiIgPT09IG4ubWV0aG9kICYmIG4uYWJydXB0KCJyZXR1cm4iLCBuLmFyZyk7CiAgCSAgICAgICAgbyA9IGY7CiAgCSAgICAgICAgdmFyIHAgPSB0cnlDYXRjaChlLCByLCBuKTsKICAJICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHAudHlwZSkgewogIAkgICAgICAgICAgaWYgKG8gPSBuLmRvbmUgPyBzIDogbCwgcC5hcmcgPT09IHkpIGNvbnRpbnVlOwogIAkgICAgICAgICAgcmV0dXJuIHsKICAJICAgICAgICAgICAgdmFsdWU6IHAuYXJnLAogIAkgICAgICAgICAgICBkb25lOiBuLmRvbmUKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgfQogIAkgICAgICAgICJ0aHJvdyIgPT09IHAudHlwZSAmJiAobyA9IHMsIG4ubWV0aG9kID0gInRocm93Iiwgbi5hcmcgPSBwLmFyZyk7CiAgCSAgICAgIH0KICAJICAgIH07CiAgCSAgfQogIAkgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgcikgewogIAkgICAgdmFyIG4gPSByLm1ldGhvZCwKICAJICAgICAgbyA9IGUuaXRlcmF0b3Jbbl07CiAgCSAgICBpZiAobyA9PT0gdCkgcmV0dXJuIHIuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBuICYmIGUuaXRlcmF0b3JbInJldHVybiJdICYmIChyLm1ldGhvZCA9ICJyZXR1cm4iLCByLmFyZyA9IHQsIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgciksICJ0aHJvdyIgPT09IHIubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbiAmJiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBuICsgIicgbWV0aG9kIikpLCB5OwogIAkgICAgdmFyIGkgPSB0cnlDYXRjaChvLCBlLml0ZXJhdG9yLCByLmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gaS50eXBlKSByZXR1cm4gci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IGkuYXJnLCByLmRlbGVnYXRlID0gbnVsbCwgeTsKICAJICAgIHZhciBhID0gaS5hcmc7CiAgCSAgICByZXR1cm4gYSA/IGEuZG9uZSA/IChyW2UucmVzdWx0TmFtZV0gPSBhLnZhbHVlLCByLm5leHQgPSBlLm5leHRMb2MsICJyZXR1cm4iICE9PSByLm1ldGhvZCAmJiAoci5tZXRob2QgPSAibmV4dCIsIHIuYXJnID0gdCksIHIuZGVsZWdhdGUgPSBudWxsLCB5KSA6IGEgOiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksIHIuZGVsZWdhdGUgPSBudWxsLCB5KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gewogIAkgICAgICB0cnlMb2M6IHRbMF0KICAJICAgIH07CiAgCSAgICAxIGluIHQgJiYgKGUuY2F0Y2hMb2MgPSB0WzFdKSwgMiBpbiB0ICYmIChlLmZpbmFsbHlMb2MgPSB0WzJdLCBlLmFmdGVyTG9jID0gdFszXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGUpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gdC5jb21wbGV0aW9uIHx8IHt9OwogIAkgICAgZS50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSBlLmFyZywgdC5jb21wbGV0aW9uID0gZTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQ29udGV4dCh0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHQuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsKICAJICB9CiAgCSAgZnVuY3Rpb24gdmFsdWVzKGUpIHsKICAJICAgIGlmIChlIHx8ICIiID09PSBlKSB7CiAgCSAgICAgIHZhciByID0gZVthXTsKICAJICAgICAgaWYgKHIpIHJldHVybiByLmNhbGwoZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBlLm5leHQpIHJldHVybiBlOwogIAkgICAgICBpZiAoIWlzTmFOKGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBvID0gLTEsCiAgCSAgICAgICAgICBpID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsrbyA8IGUubGVuZ3RoOykgaWYgKG4uY2FsbChlLCBvKSkgcmV0dXJuIG5leHQudmFsdWUgPSBlW29dLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgcmV0dXJuIGkubmV4dCA9IGk7CiAgCSAgICAgIH0KICAJICAgIH0KICAJICAgIHRocm93IG5ldyBUeXBlRXJyb3IoX3R5cGVvZihlKSArICIgaXMgbm90IGl0ZXJhYmxlIik7CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgbyhnLCAiY29uc3RydWN0b3IiLCB7CiAgCSAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgCSAgICBjb25maWd1cmFibGU6ICEwCiAgCSAgfSksIG8oR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBlLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAodCkgewogIAkgICAgdmFyIGUgPSAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmIHQuY29uc3RydWN0b3I7CiAgCSAgICByZXR1cm4gISFlICYmIChlID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAiR2VuZXJhdG9yRnVuY3Rpb24iID09PSAoZS5kaXNwbGF5TmFtZSB8fCBlLm5hbWUpKTsKICAJICB9LCBlLm1hcmsgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZih0LCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAodC5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKHQsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpKSwgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGcpLCB0OwogIAkgIH0sIGUuYXdyYXAgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgX19hd2FpdDogdAogIAkgICAgfTsKICAJICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGMsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pLCBlLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBlLmFzeW5jID0gZnVuY3Rpb24gKHQsIHIsIG4sIG8sIGkpIHsKICAJICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFByb21pc2UpOwogIAkgICAgdmFyIGEgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKHQsIHIsIG4sIG8pLCBpKTsKICAJICAgIHJldHVybiBlLmlzR2VuZXJhdG9yRnVuY3Rpb24ocikgPyBhIDogYS5uZXh0KCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICByZXR1cm4gdC5kb25lID8gdC52YWx1ZSA6IGEubmV4dCgpOwogIAkgICAgfSk7CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKGcpLCBkZWZpbmUoZywgdSwgIkdlbmVyYXRvciIpLCBkZWZpbmUoZywgYSwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShnLCAidG9TdHJpbmciLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgCSAgfSksIGUua2V5cyA9IGZ1bmN0aW9uICh0KSB7CiAgCSAgICB2YXIgZSA9IE9iamVjdCh0KSwKICAJICAgICAgciA9IFtdOwogIAkgICAgZm9yICh2YXIgbiBpbiBlKSByLnB1c2gobik7CiAgCSAgICByZXR1cm4gci5yZXZlcnNlKCksIGZ1bmN0aW9uIG5leHQoKSB7CiAgCSAgICAgIGZvciAoOyByLmxlbmd0aDspIHsKICAJICAgICAgICB2YXIgdCA9IHIucG9wKCk7CiAgCSAgICAgICAgaWYgKHQgaW4gZSkgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGUudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KGUpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB0LCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gIm5leHQiLCB0aGlzLmFyZyA9IHQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhZSkgZm9yICh2YXIgciBpbiB0aGlzKSAidCIgPT09IHIuY2hhckF0KDApICYmIG4uY2FsbCh0aGlzLCByKSAmJiAhaXNOYU4oK3Iuc2xpY2UoMSkpICYmICh0aGlzW3JdID0gdCk7CiAgCSAgICB9LAogIAkgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAJICAgICAgdGhpcy5kb25lID0gITA7CiAgCSAgICAgIHZhciB0ID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gdGhpcy5ydmFsOwogIAkgICAgfSwKICAJICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihlKSB7CiAgCSAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGU7CiAgCSAgICAgIHZhciByID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKG4sIG8pIHsKICAJICAgICAgICByZXR1cm4gYS50eXBlID0gInRocm93IiwgYS5hcmcgPSBlLCByLm5leHQgPSBuLCBvICYmIChyLm1ldGhvZCA9ICJuZXh0Iiwgci5hcmcgPSB0KSwgISFvOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIG8gPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgbyA+PSAwOyAtLW8pIHsKICAJICAgICAgICB2YXIgaSA9IHRoaXMudHJ5RW50cmllc1tvXSwKICAJICAgICAgICAgIGEgPSBpLmNvbXBsZXRpb247CiAgCSAgICAgICAgaWYgKCJyb290IiA9PT0gaS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogIAkgICAgICAgIGlmIChpLnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBjID0gbi5jYWxsKGksICJjYXRjaExvYyIpLAogIAkgICAgICAgICAgICB1ID0gbi5jYWxsKGksICJmaW5hbGx5TG9jIik7CiAgCSAgICAgICAgICBpZiAoYyAmJiB1KSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShpLmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChjKSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghdSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgaS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGkuZmluYWxseUxvYyk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICB9CiAgCSAgICB9LAogIAkgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodCwgZSkgewogIAkgICAgICBmb3IgKHZhciByID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHIgPj0gMDsgLS1yKSB7CiAgCSAgICAgICAgdmFyIG8gPSB0aGlzLnRyeUVudHJpZXNbcl07CiAgCSAgICAgICAgaWYgKG8udHJ5TG9jIDw9IHRoaXMucHJldiAmJiBuLmNhbGwobywgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBvLmZpbmFsbHlMb2MpIHsKICAJICAgICAgICAgIHZhciBpID0gbzsKICAJICAgICAgICAgIGJyZWFrOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICBpICYmICgiYnJlYWsiID09PSB0IHx8ICJjb250aW51ZSIgPT09IHQpICYmIGkudHJ5TG9jIDw9IGUgJiYgZSA8PSBpLmZpbmFsbHlMb2MgJiYgKGkgPSBudWxsKTsKICAJICAgICAgdmFyIGEgPSBpID8gaS5jb21wbGV0aW9uIDoge307CiAgCSAgICAgIHJldHVybiBhLnR5cGUgPSB0LCBhLmFyZyA9IGUsIGkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGkuZmluYWxseUxvYywgeSkgOiB0aGlzLmNvbXBsZXRlKGEpOwogIAkgICAgfSwKICAJICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSh0LCBlKSB7CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gImJyZWFrIiA9PT0gdC50eXBlIHx8ICJjb250aW51ZSIgPT09IHQudHlwZSA/IHRoaXMubmV4dCA9IHQuYXJnIDogInJldHVybiIgPT09IHQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gdC50eXBlICYmIGUgJiYgKHRoaXMubmV4dCA9IGUpLCB5OwogIAkgICAgfSwKICAJICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKHQpIHsKICAJICAgICAgZm9yICh2YXIgZSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBlID49IDA7IC0tZSkgewogIAkgICAgICAgIHZhciByID0gdGhpcy50cnlFbnRyaWVzW2VdOwogIAkgICAgICAgIGlmIChyLmZpbmFsbHlMb2MgPT09IHQpIHJldHVybiB0aGlzLmNvbXBsZXRlKHIuY29tcGxldGlvbiwgci5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkociksIHk7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godCkgewogIAkgICAgICBmb3IgKHZhciBlID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGUgPj0gMDsgLS1lKSB7CiAgCSAgICAgICAgdmFyIHIgPSB0aGlzLnRyeUVudHJpZXNbZV07CiAgCSAgICAgICAgaWYgKHIudHJ5TG9jID09PSB0KSB7CiAgCSAgICAgICAgICB2YXIgbiA9IHIuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSBuLnR5cGUpIHsKICAJICAgICAgICAgICAgdmFyIG8gPSBuLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShyKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICAgIHJldHVybiBvOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoZSwgciwgbikgewogIAkgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAJICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGUpLAogIAkgICAgICAgIHJlc3VsdE5hbWU6IHIsCiAgCSAgICAgICAgbmV4dExvYzogbgogIAkgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHQpLCB5OwogIAkgICAgfQogIAkgIH0sIGU7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMSkpOwoKICB2YXIgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyA9IHJlZ2VuZXJhdG9yUnVudGltZSQxLmV4cG9ydHM7CgogIC8vIFRPRE8oQmFiZWwgOCk6IFJlbW92ZSB0aGlzIGZpbGUuCgogIHZhciBydW50aW1lID0gcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cygpOwogIHZhciByZWdlbmVyYXRvciA9IHJ1bnRpbWU7CgogIC8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS9ydW50aW1lLmpzI0w3MzY9CiAgdHJ5IHsKICAgIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOwogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOwogICAgfQogIH0KCiAgdmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMocmVnZW5lcmF0b3IpOwoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQ0KICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZDQogIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SDQogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgew0KICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH0NCiAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICB9KTsNCiAgfQoKICBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgewogICAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICAgIG8uX19wcm90b19fID0gcDsKICAgICAgcmV0dXJuIG87CiAgICB9OwogICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsKICB9CgogIGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgewogICAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAiZnVuY3Rpb24iICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsKICAgIH0KICAgIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgewogICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgIHZhbHVlOiBzdWJDbGFzcywKICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfQogICAgfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsICJwcm90b3R5cGUiLCB7CiAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgfSk7CiAgICBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsKICB9CgogIGZ1bmN0aW9uIF90eXBlb2YobykgewogICAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgICByZXR1cm4gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsKICAgICAgcmV0dXJuIHR5cGVvZiBvOwogICAgfSA6IGZ1bmN0aW9uIChvKSB7CiAgICAgIHJldHVybiBvICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG87CiAgICB9LCBfdHlwZW9mKG8pOwogIH0KCiAgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsKICAgIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsKICAgICAgcmV0dXJuIGNhbGw7CiAgICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpOwogICAgfQogICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7CiAgfQoKICBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgewogICAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7CiAgICB9OwogICAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsKICB9CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQxKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsKICAgIGlmIChfdHlwZW9mKGlucHV0KSAhPT0gIm9iamVjdCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsKICAgIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsKICAgIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsKICAgICAgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCAiZGVmYXVsdCIpOwogICAgICBpZiAoX3R5cGVvZihyZXMpICE9PSAib2JqZWN0IikgcmV0dXJuIHJlczsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKTsKICAgIH0KICAgIHJldHVybiAoaGludCA9PT0gInN0cmluZyIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsKICB9CgogIGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgewogICAgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsICJzdHJpbmciKTsKICAgIHJldHVybiBfdHlwZW9mKGtleSkgPT09ICJzeW1ib2wiID8ga2V5IDogU3RyaW5nKGtleSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQxKHRhcmdldCwgcHJvcHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOwogICAgfQogIH0KICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkMShDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQxKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICB9CgogIC8qDQogICAgQ29weXJpZ2h0IDIwMjItMjAyMyBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyoqDQogICAqIEJhc2VQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gUHZGaWxlKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBQdkZpbGUpOwogICAgICB0aGlzLl9wYXRoID0gJyc7CiAgICB9CiAgICAvKioNCiAgICAgKiBHZXR0ZXIgZm9yIGZpbGUncyBtZXRhIGluZm9ybWF0aW9uLg0KICAgICAqLwogICAgX2NyZWF0ZUNsYXNzJDEoUHZGaWxlLCBbewogICAgICBrZXk6ICJtZXRhIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgaWYgKHRoaXMuX21ldGEgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oewogICAgICAgICAgdmVyc2lvbjogMAogICAgICAgIH0sIHRoaXMuX21ldGEpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInBhZ2VTaXplIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIEdldCB0aGUgZmlsZSBwb2ludGVyIGZyb20gdGhlIF9maWxlUHRycyBtYXAuDQogICAgICAgKiBAcGFyYW0gcHRyIFRoZSBwb2ludGVyIHRvIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gZ2V0IGZyb20gdGhlIG1hcC4NCiAgICAgICAqIEByZXR1cm5zIEJhc2VQdkZpbGUgcmV0dXJucyB0aGUgY3VycmVudCBmaWxlIGluc3RhbmNlIHJlbGF0ZWQgdG8gcHRyLg0KICAgICAgICovCiAgICB9XSwgW3sKICAgICAga2V5OiAiZ2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFB0cihwdHIpIHsKICAgICAgICBpZiAoUHZGaWxlLl9maWxlUHRycy5oYXMocHRyKSkgewogICAgICAgICAgcmV0dXJuIFB2RmlsZS5fZmlsZVB0cnMuZ2V0KHB0cik7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpbnN0YW5jZSBub3QgZm91bmQuJyk7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBTYXZlcyB0aGUgQmFzZVB2RmlsZSBpbnN0YW5jZSB0byB0aGUgbWFwIHdpdGggYW4gYXNzb2NpYXRlZCBwdHIuDQogICAgICAgKiBAcGFyYW0gcHRyIFRoZSBmaWxlIHBvaW50ZXIgdG8gc2F2ZSBhcyB0aGUga2V5Lg0KICAgICAgICogQHBhcmFtIGluc3RhbmNlIFRoZSBCYXNlUHZGaWxlIGluc3RhbmNlIHRvIHNhdmUgYXMgdGhlIHZhbHVlLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInNldFB0ciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQdHIocHRyLCBpbnN0YW5jZSkgewogICAgICAgIFB2RmlsZS5fZmlsZVB0cnMuc2V0KHB0ciwgaW5zdGFuY2UpOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogUmVtb3ZlcyB0aGUgcHRyIGZyb20gdGhlIF9maWxlUHRycyBtYXAuDQogICAgICAgKiBAcGFyYW0gcHRyIFRoZSBmaWxlIHBvaW50ZXIgdG8gcmVtb3ZlLg0KICAgICAgICovCiAgICB9LCB7CiAgICAgIGtleTogInJlbW92ZVB0ciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVQdHIocHRyKSB7CiAgICAgICAgUHZGaWxlLl9maWxlUHRyc1siZGVsZXRlIl0ocHRyKTsKICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIFB2RmlsZTsKICB9KCk7CiAgUHZGaWxlLl9maWxlUHRycyA9IG5ldyBNYXAoKTsKCiAgZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH0KICBmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJ1bmRlZmluZWQiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSAiZnVuY3Rpb24iKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfQogIC8qKg0KICAgKiBQdkZpbGVNZW0gQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGVNZW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdkZpbGUpIHsKICAgIF9pbmhlcml0cyhQdkZpbGVNZW0sIF9QdkZpbGUpOwogICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihQdkZpbGVNZW0pOwogICAgZnVuY3Rpb24gUHZGaWxlTWVtKHBhdGgsIG1ldGEsIGRiLCBtb2RlKSB7CiAgICAgIHZhciBfdGhpczsKICAgICAgX2NsYXNzQ2FsbENoZWNrJDEodGhpcywgUHZGaWxlTWVtKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKICAgICAgX3RoaXMuX3BvcyA9IDA7CiAgICAgIF90aGlzLl9wYXRoID0gcGF0aDsKICAgICAgX3RoaXMuX21ldGEgPSBtZXRhOwogICAgICBfdGhpcy5fbW9kZSA9IG1vZGU7CiAgICAgIHJldHVybiBfdGhpczsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyQxKFB2RmlsZU1lbSwgW3sKICAgICAga2V5OiAiY2xvc2UiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInJlYWQiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVhZChzaXplLCBjb3VudCkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCInIi5jb25jYXQodGhpcy5fcGF0aCwgIicgZG9lc24ndCBleGlzdC4iKSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9pc0VPRikgewogICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRU9GIik7CiAgICAgICAgICBlcnIubmFtZSA9ICJFbmRPZkZpbGUiOwogICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgIH0KICAgICAgICB2YXIgdG9Db3B5ID0gTWF0aC5taW4oc2l6ZSAqIGNvdW50LCB0aGlzLl9maWxlLmxlbmd0aCAtIHRoaXMuX3Bvcyk7CiAgICAgICAgdmFyIHRvdGFsRWxlbXMgPSB0b0NvcHkgLSB0b0NvcHkgJSBzaXplOwogICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbEVsZW1zKTsKICAgICAgICBidWZmZXIuc2V0KHRoaXMuX2ZpbGUuc2xpY2UodGhpcy5fcG9zLCB0aGlzLl9wb3MgKyB0b3RhbEVsZW1zKSwgMCk7CiAgICAgICAgdGhpcy5fcG9zICs9IHRvdGFsRWxlbXM7CiAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJ3cml0ZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiB3cml0ZShjb250ZW50KSB7CiAgICAgICAgdmFyIG5ld0ZpbGUgPSBuZXcgVWludDhBcnJheSh0aGlzLl9wb3MgKyBjb250ZW50Lmxlbmd0aCk7CiAgICAgICAgaWYgKHRoaXMuX2ZpbGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgbmV3RmlsZS5zZXQodGhpcy5fZmlsZS5zbGljZSgwLCB0aGlzLl9wb3MpKTsKICAgICAgICAgIG5ld0ZpbGUuc2V0KGNvbnRlbnQsIHRoaXMuX3Bvcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5ld0ZpbGUuc2V0KGNvbnRlbnQpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9maWxlID0gbmV3RmlsZTsKICAgICAgICB0aGlzLl9wb3MgKz0gY29udGVudC5sZW5ndGg7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAic2VlayIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZWVrKG9mZnNldCwgd2hlbmNlKSB7CiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygpICYmIHRoaXMuX21vZGUgPT09ICJyZWFkb25seSIpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJyIuY29uY2F0KHRoaXMuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkpIHsKICAgICAgICAgIC8vIFRoaXMgaXMgdmFsaWQgaW4gSVNPIEMgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjdXJyZW50IGltcGxlbWVudGF0aW9uCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld09mZnNldDsKICAgICAgICBpZiAod2hlbmNlID09PSAwKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKHdoZW5jZSA9PT0gMSkgewogICAgICAgICAgbmV3T2Zmc2V0ID0gTWF0aC5taW4odGhpcy5fcG9zICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDIpIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKHRoaXMuX2ZpbGUubGVuZ3RoICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBvcGVyYXRpb246ICIuY29uY2F0KHdoZW5jZSwgIi4iKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BvcyA9IG5ld09mZnNldDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJ0ZWxsIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRlbGwoKSB7CiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygpKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9wb3M7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZSgpIHsKICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7CiAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKCkpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFTk9FTlQiKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBQdkZpbGVNZW0uX21lbUZpbGVzWyJkZWxldGUiXSh0aGlzLl9wYXRoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3BvcyA9IDA7CiAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTsKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZXhpc3RzIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGV4aXN0cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZmlsZSAhPT0gdW5kZWZpbmVkOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIl9pc0VPRiIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9wb3MgPj0gdGhpcy5fZmlsZS5sZW5ndGg7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2ZpbGUiLAogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICByZXR1cm4gUHZGaWxlTWVtLl9tZW1GaWxlcy5nZXQodGhpcy5fcGF0aCk7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGNvbnRlbnQpIHsKICAgICAgICBQdkZpbGVNZW0uX21lbUZpbGVzLnNldCh0aGlzLl9wYXRoLCBjb250ZW50KTsKICAgICAgfQogICAgfV0sIFt7CiAgICAgIGtleTogIm9wZW4iLAogICAgICB2YWx1ZTogZnVuY3Rpb24gb3BlbihwYXRoLCBtb2RlKSB7CiAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uX21lbUZpbGVzLmdldChwYXRoKTsKICAgICAgICB2YXIgZGJNb2RlID0gbW9kZS5pbmNsdWRlcygncicpID8gInJlYWRvbmx5IiA6ICJyZWFkd3JpdGUiOwogICAgICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQgJiYgZGJNb2RlID09PSAicmVhZG9ubHkiKSB7CiAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoIiciLmNvbmNhdChwYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICAgIGVycm9yLm5hbWUgPSAiRmlsZU5vdEV4aXN0cyI7CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgICAgdmFyIGZpbGVNZW0gPSBuZXcgUHZGaWxlTWVtKHBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBkYk1vZGUpOwogICAgICAgIGlmIChtb2RlLmluY2x1ZGVzKCdhJykpIHsKICAgICAgICAgIGZpbGVNZW0uc2VlaygwLCAyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpbGVNZW07CiAgICAgIH0KICAgIH1dKTsKICAgIHJldHVybiBQdkZpbGVNZW07CiAgfShQdkZpbGUpOwogIFB2RmlsZU1lbS5fbWVtRmlsZXMgPSBuZXcgTWFwKCk7CiAgLyoqDQogICAqIENhc3QgYSBzaWduZWQgYWRkcmVzcyB0byB1bnNpZ25lZCBhZGRyZXNzLg0KICAgKg0KICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byBjYXN0IHRvIHVuc2lnbmVkIGFkZHJlc3MuDQogICAqLwogIGZ1bmN0aW9uIHVuc2lnbmVkQWRkcmVzcyhhZGRyZXNzKSB7CiAgICBpZiAoYWRkcmVzcyA8IDApIHsKICAgICAgcmV0dXJuIGFkZHJlc3MgPj4+IDA7CiAgICB9CiAgICByZXR1cm4gYWRkcmVzczsKICB9CgogIHZhciBQdlhwdUFjdGlvbjsKICAoZnVuY3Rpb24gKFB2WHB1QWN0aW9uKSB7CiAgICBQdlhwdUFjdGlvbltQdlhwdUFjdGlvblsiSU5JVCJdID0gMF0gPSAiSU5JVCI7CiAgICBQdlhwdUFjdGlvbltQdlhwdUFjdGlvblsiQUxMT0MiXSA9IDFdID0gIkFMTE9DIjsKICAgIFB2WHB1QWN0aW9uW1B2WHB1QWN0aW9uWyJGUkVFIl0gPSAyXSA9ICJGUkVFIjsKICAgIFB2WHB1QWN0aW9uW1B2WHB1QWN0aW9uWyJDT1BZX1RPX1hQVSJdID0gM10gPSAiQ09QWV9UT19YUFUiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIkNPUFlfRlJPTV9YUFUiXSA9IDRdID0gIkNPUFlfRlJPTV9YUFUiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIk1FTVNFVCJdID0gNV0gPSAiTUVNU0VUIjsKICAgIFB2WHB1QWN0aW9uW1B2WHB1QWN0aW9uWyJUSU1FUl9TVEFSVCJdID0gNl0gPSAiVElNRVJfU1RBUlQiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIlRJTUVSX1NUT1AiXSA9IDddID0gIlRJTUVSX1NUT1AiOwogICAgLy8gb3RoZXIgeHB1IGFjdGlvbnMKICAgIFB2WHB1QWN0aW9uW1B2WHB1QWN0aW9uWyJNQVRSSVhfVkVDVE9SX01VTFRJUExZIl0gPSA4XSA9ICJNQVRSSVhfVkVDVE9SX01VTFRJUExZIjsKICAgIFB2WHB1QWN0aW9uW1B2WHB1QWN0aW9uWyJTWU5DX1ZFQ1RPUiJdID0gOV0gPSAiU1lOQ19WRUNUT1IiOwogIH0pKFB2WHB1QWN0aW9uIHx8IChQdlhwdUFjdGlvbiA9IHt9KSk7CgogIGNvbnN0IHdhc2lfc25hcHNob3RfcHJldmlldzFfZW11bGF0b3IgPSB7CiAgICBhcmdzX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGFyZ3Nfc2l6ZXNfZ2V0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZW52aXJvbl9nZXQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBlbnZpcm9uX3NpemVzX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGNsb2NrX3Jlc19nZXQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBjbG9ja190aW1lX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2FkdmlzZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2FsbG9jYXRlOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfY2xvc2U6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9kYXRhc3luYzogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Zkc3RhdF9nZXQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9mZHN0YXRfc2V0X2ZsYWdzOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmRzdGF0X3NldF9yaWdodHM6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9maWxlc3RhdF9nZXQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9maWxlc3RhdF9zZXRfc2l6ZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2ZpbGVzdGF0X3NldF90aW1lczogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3ByZWFkOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcHJlc3RhdF9nZXQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wcmVzdGF0X2Rpcl9uYW1lOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcHdyaXRlOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcmVhZDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3JlYWRkaXI6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9yZW51bWJlcjogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3NlZWs6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9zeW5jOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfdGVsbDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3dyaXRlOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9jcmVhdGVfZGlyZWN0b3J5OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9maWxlc3RhdF9nZXQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2ZpbGVzdGF0X3NldF90aW1lczogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfbGluazogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfb3BlbjogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfcmVhZGxpbms6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3JlbW92ZV9kaXJlY3Rvcnk6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX3JlbmFtZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfc3ltbGluazogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfdW5saW5rX2ZpbGU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwb2xsX29uZW9mZjogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHByb2NfZXhpdDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHByb2NfcmFpc2U6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzY2hlZF95aWVsZDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHJhbmRvbV9nZXQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3JlY3Y6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3NlbmQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBzb2NrX3NodXRkb3duOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogIH07CgogIHZhciBtYXRyaXhWZWN0b3JNdWx0aXBseSA9IGZ1bmN0aW9uIG1hdHJpeFZlY3Rvck11bHRpcGx5KGRhdGEpIHsKICAgIHZhciBfZGF0YSRnbG9iYWxzID0gZGF0YS5nbG9iYWxzLAogICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFscy5leHBvcnRzLAogICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMubWVtQWxsb2MsCiAgICAgIG1lbW9yeSA9IF9kYXRhJGdsb2JhbHMubWVtb3J5OwogICAgdmFyIG1hdHJpeEFkZHJlc3MgPSBkYXRhLm1hdHJpeEFkZHJlc3MsCiAgICAgIHZlY3RvckFkZHJlc3MgPSBkYXRhLnZlY3RvckFkZHJlc3MsCiAgICAgIG0gPSBkYXRhLm0sCiAgICAgIG4gPSBkYXRhLm4sCiAgICAgIHJlc3VsdEFkZHJlc3MgPSBkYXRhLnJlc3VsdEFkZHJlc3M7CiAgICB2YXIgcHZfbWF0cml4X3ZlY3Rvcl9tdWx0aXBseSA9IGV4cG9ydHMucHZfbWF0cml4X3ZlY3Rvcl9tdWx0aXBseTsKICAgIGlmICghbWVtQWxsb2MuaGFzKG1hdHJpeEFkZHJlc3MpIHx8ICFtZW1BbGxvYy5oYXModmVjdG9yQWRkcmVzcykgfHwgIW1lbUFsbG9jLmhhcyhyZXN1bHRBZGRyZXNzKSkgewogICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheSgwKTsKICAgIH0KICAgIHZhciBtZW1vcnlCdWZmZXJGbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgIHZhciBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KG1hdHJpeEFkZHJlc3MpLAogICAgICB3b3JrZXJNYXRyaXhBZGRyZXNzID0gX21lbUFsbG9jJGdldC53b3JrZXJNZW1BZGRyZXNzOwogICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KHZlY3RvckFkZHJlc3MpLAogICAgICB3b3JrZXJWZWN0b3JBZGRyZXNzID0gX21lbUFsbG9jJGdldDIud29ya2VyTWVtQWRkcmVzczsKICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldChyZXN1bHRBZGRyZXNzKSwKICAgICAgd29ya2VyUmVzdWx0QWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQzLndvcmtlck1lbUFkZHJlc3M7CiAgICBwdl9tYXRyaXhfdmVjdG9yX211bHRpcGx5KHdvcmtlck1hdHJpeEFkZHJlc3MsIHdvcmtlclZlY3RvckFkZHJlc3MsIG0sIG4sIHdvcmtlclJlc3VsdEFkZHJlc3MpOwogICAgcmV0dXJuIG1lbW9yeUJ1ZmZlckZsb2F0MzIuc2xpY2Uod29ya2VyUmVzdWx0QWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgd29ya2VyUmVzdWx0QWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCArIG0pOwogIH07CiAgdmFyIHN5bmNWZWN0b3IgPSBmdW5jdGlvbiBzeW5jVmVjdG9yKGRhdGEpIHsKICAgIHZhciBfZGF0YSRnbG9iYWxzMiA9IGRhdGEuZ2xvYmFscywKICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzMi5tZW1BbGxvYywKICAgICAgbWVtb3J5ID0gX2RhdGEkZ2xvYmFsczIubWVtb3J5OwogICAgdmFyIHZlY3RvckFkZHJlc3MgPSBkYXRhLnZlY3RvckFkZHJlc3MsCiAgICAgIGJ1ZmZlciA9IGRhdGEuYnVmZmVyOwogICAgaWYgKG1lbUFsbG9jLmhhcyh2ZWN0b3JBZGRyZXNzKSkgewogICAgICB2YXIgbWVtb3J5QnVmZmVyRmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NCA9IG1lbUFsbG9jLmdldCh2ZWN0b3JBZGRyZXNzKSwKICAgICAgICB3b3JrZXJNZW1BZGRyZXNzID0gX21lbUFsbG9jJGdldDQud29ya2VyTWVtQWRkcmVzczsKICAgICAgbWVtb3J5QnVmZmVyRmxvYXQzMi5zZXQoYnVmZmVyLCB3b3JrZXJNZW1BZGRyZXNzIC8gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgIH0KICB9OwogIHZhciBwdk12bUFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFB2WHB1QWN0aW9uLk1BVFJJWF9WRUNUT1JfTVVMVElQTFksIG1hdHJpeFZlY3Rvck11bHRpcGx5KSwgUHZYcHVBY3Rpb24uU1lOQ19WRUNUT1IsIHN5bmNWZWN0b3IpOwoKICAvKiBlc2xpbnQgY2FtZWxjYXNlOiAwICovCiAgdmFyIFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbjsKICAoZnVuY3Rpb24gKFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbikgewogICAgUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uW1B2UGljb2xsbUF0dGVudGlvbkFjdGlvblsiQVRURU5USU9OX1BSRUNPTVBVVEVfRU5DT0RJTkciXSA9IDIwMF0gPSAiQVRURU5USU9OX1BSRUNPTVBVVEVfRU5DT0RJTkciOwogICAgUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uW1B2UGljb2xsbUF0dGVudGlvbkFjdGlvblsiQVRURU5USU9OX0FUVEVORF9DT01CSU5FRCJdID0gMjAxXSA9ICJBVFRFTlRJT05fQVRURU5EX0NPTUJJTkVEIjsKICB9KShQdlBpY29sbG1BdHRlbnRpb25BY3Rpb24gfHwgKFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbiA9IHt9KSk7CgogIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOwogICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHRvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsICJwcm90b3R5cGUiLCB7CiAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgfSk7CiAgICByZXR1cm4gQ29uc3RydWN0b3I7CiAgfQoKICBmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1siQEBpdGVyYXRvciJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0WyJyZXR1cm4iXSAhPSBudWxsKSBpdFsicmV0dXJuIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSAiT2JqZWN0IiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9CiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH0KICB2YXIgUHZYcHUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gUHZYcHUoKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQdlhwdSk7CiAgICB9CiAgICBfY3JlYXRlQ2xhc3MoUHZYcHUsIG51bGwsIFt7CiAgICAgIGtleTogImFkZFhwdSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRYcHUob2JqQWRkcmVzcywgZGF0YSkgewogICAgICAgIFB2WHB1LnhwdU9iamVjdHMuc2V0KG9iakFkZHJlc3MsIGRhdGEpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImdldFhwdSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRYcHUob2JqQWRkcmVzcykgewogICAgICAgIHJldHVybiBQdlhwdS54cHVPYmplY3RzLmdldChvYmpBZGRyZXNzKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJoYXNYcHUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gaGFzWHB1KG9iakFkZHJlc3MpIHsKICAgICAgICByZXR1cm4gUHZYcHUueHB1T2JqZWN0cy5oYXMob2JqQWRkcmVzcyk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlWHB1IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVhwdShvYmpBZGRyZXNzKSB7CiAgICAgICAgaWYgKFB2WHB1LnhwdU9iamVjdHMuaGFzKG9iakFkZHJlc3MpKSB7CiAgICAgICAgICB2YXIgX1B2WHB1JHhwdU9iamVjdHMkZ2V0ID0gUHZYcHUueHB1T2JqZWN0cy5nZXQob2JqQWRkcmVzcyksCiAgICAgICAgICAgIGRldmljZU1lbSA9IF9QdlhwdSR4cHVPYmplY3RzJGdldC5kZXZpY2VNZW07CiAgICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGV2aWNlTWVtKSwKICAgICAgICAgICAgX3N0ZXA7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgewogICAgICAgICAgICAgIHZhciBtZW1BZGRyZXNzID0gX3N0ZXAudmFsdWU7CiAgICAgICAgICAgICAgUHZYcHUubWVtb3J5T2JqZWN0c1siZGVsZXRlIl0obWVtQWRkcmVzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBfaXRlcmF0b3IuZShlcnIpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgX2l0ZXJhdG9yLmYoKTsKICAgICAgICAgIH0KICAgICAgICAgIFB2WHB1LnhwdU9iamVjdHNbImRlbGV0ZSJdKG9iakFkZHJlc3MpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJhZGRNZW1vcnkiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gYWRkTWVtb3J5KG1lbUFkZHJlc3MsIGRhdGEpIHsKICAgICAgICBQdlhwdS5tZW1vcnlPYmplY3RzLnNldChtZW1BZGRyZXNzLCBkYXRhKTsKICAgICAgICBQdlhwdS54cHVPYmplY3RzLmdldChkYXRhLm9iakFkZHJlc3MpLmRldmljZU1lbS5hZGQobWVtQWRkcmVzcyk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZ2V0TWVtb3J5IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1lbW9yeShtZW1BZGRyZXNzKSB7CiAgICAgICAgcmV0dXJuIFB2WHB1Lm1lbW9yeU9iamVjdHMuZ2V0KG1lbUFkZHJlc3MpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImhhc01lbW9yeSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNNZW1vcnkobWVtQWRkcmVzcykgewogICAgICAgIHJldHVybiBQdlhwdS5tZW1vcnlPYmplY3RzLmhhcyhtZW1BZGRyZXNzKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmVNZW1vcnkiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlTWVtb3J5KG1lbUFkZHJlc3MpIHsKICAgICAgICBpZiAoUHZYcHUuaGFzTWVtb3J5KG1lbUFkZHJlc3MpKSB7CiAgICAgICAgICBQdlhwdS54cHVPYmplY3RzLmdldChQdlhwdS5nZXRNZW1vcnkobWVtQWRkcmVzcykub2JqQWRkcmVzcykuZGV2aWNlTWVtWyJkZWxldGUiXShtZW1BZGRyZXNzKTsKICAgICAgICB9CiAgICAgICAgUHZYcHUubWVtb3J5T2JqZWN0c1siZGVsZXRlIl0obWVtQWRkcmVzcyk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZ2V0VW5pcXVlUG9pbnRlciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRVbmlxdWVQb2ludGVyKCkgewogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICB2YXIgcHRyID0gTWF0aC5jZWlsKChwZXJmb3JtYW5jZS5ub3coKSArIE1hdGgucmFuZG9tKCkpICogMTBlMik7CiAgICAgICAgICBpZiAoIXRoaXMudW5pcXVlUG9pbnRlcnMuaGFzKHB0cikpIHsKICAgICAgICAgICAgdGhpcy51bmlxdWVQb2ludGVycy5hZGQocHRyKTsKICAgICAgICAgICAgcmV0dXJuIHB0cjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlVW5pcXVlUG9pbnRlciIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVVbmlxdWVQb2ludGVyKHB0cikgewogICAgICAgIGlmICh0aGlzLnVuaXF1ZVBvaW50ZXJzLmhhcyhwdHIpKSB7CiAgICAgICAgICB0aGlzLnVuaXF1ZVBvaW50ZXJzWyJkZWxldGUiXShwdHIpOwogICAgICAgIH0KICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIFB2WHB1OwogIH0oKTsKICBfZGVmaW5lUHJvcGVydHkoUHZYcHUsICJ4cHVPYmplY3RzIiwgbmV3IE1hcCgpKTsKICBfZGVmaW5lUHJvcGVydHkoUHZYcHUsICJtZW1vcnlPYmplY3RzIiwgbmV3IE1hcCgpKTsKICBfZGVmaW5lUHJvcGVydHkoUHZYcHUsICJ1bmlxdWVQb2ludGVycyIsIG5ldyBTZXQoKSk7CgogIHZhciBhdHRlbnRpb25QcmVjb21wdXRlRW5jb2RpbmcgPSBmdW5jdGlvbiBhdHRlbnRpb25QcmVjb21wdXRlRW5jb2RpbmcoZGF0YSkgewogICAgdmFyIF9kYXRhJGdsb2JhbHMgPSBkYXRhLmdsb2JhbHMsCiAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzLmV4cG9ydHMsCiAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFscy5tZW1BbGxvYzsKICAgIHZhciBlbmNvZGluZ0FkZHJlc3MgPSBkYXRhLmVuY29kaW5nQWRkcmVzcywKICAgICAgZGltZW5zaW9uID0gZGF0YS5kaW1lbnNpb24sCiAgICAgIHN0ZXBzID0gZGF0YS5zdGVwcywKICAgICAgdGhldGEgPSBkYXRhLnRoZXRhOwogICAgdmFyIHB2X3BpY29sbG1fYXR0ZW50aW9uX3ByZWNvbXB1dGVfZW5jb2Rpbmdfd2FzbSA9IGV4cG9ydHMucHZfcGljb2xsbV9hdHRlbnRpb25fcHJlY29tcHV0ZV9lbmNvZGluZ193YXNtOwogICAgdmFyIF9tZW1BbGxvYyRnZXQgPSBtZW1BbGxvYy5nZXQoZW5jb2RpbmdBZGRyZXNzKSwKICAgICAgd29ya2VyRW5jb2RpbmdBZGRyZXNzID0gX21lbUFsbG9jJGdldC53b3JrZXJNZW1BZGRyZXNzOwogICAgcHZfcGljb2xsbV9hdHRlbnRpb25fcHJlY29tcHV0ZV9lbmNvZGluZ193YXNtKHdvcmtlckVuY29kaW5nQWRkcmVzcywgZGltZW5zaW9uLCBzdGVwcywgdGhldGEpOwogIH07CiAgdmFyIGF0dGVudGlvbkF0dGVuZENvbWJpbmVkID0gZnVuY3Rpb24gYXR0ZW50aW9uQXR0ZW5kQ29tYmluZWQoZGF0YSkgewogICAgdmFyIF9kYXRhJGdsb2JhbHMyID0gZGF0YS5nbG9iYWxzLAogICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczIuZXhwb3J0cywKICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzMi5tZW1BbGxvYywKICAgICAgbWVtb3J5ID0gX2RhdGEkZ2xvYmFsczIubWVtb3J5OwogICAgdmFyIG51bUhlYWRzID0gZGF0YS5udW1IZWFkcywKICAgICAgbnVtS3ZIZWFkcyA9IGRhdGEubnVtS3ZIZWFkcywKICAgICAgd2luZG93TGVuZ3RoID0gZGF0YS53aW5kb3dMZW5ndGgsCiAgICAgIGhlYWREaW1lbnNpb24gPSBkYXRhLmhlYWREaW1lbnNpb24sCiAgICAgIHJvcGVEaW1lbnNpb24gPSBkYXRhLnJvcGVEaW1lbnNpb24sCiAgICAgIHJvcGVJbnRlcmxlYXZlZCA9IGRhdGEucm9wZUludGVybGVhdmVkLAogICAgICBuZXdFbmNvZGluZ0FkZHJlc3MgPSBkYXRhLm5ld0VuY29kaW5nQWRkcmVzcywKICAgICAgcUJ1ZmZlciA9IGRhdGEucUJ1ZmZlciwKICAgICAga0J1ZmZlciA9IGRhdGEua0J1ZmZlciwKICAgICAgdkJ1ZmZlciA9IGRhdGEudkJ1ZmZlciwKICAgICAga2V5c0FkZHJlc3MgPSBkYXRhLmtleXNBZGRyZXNzLAogICAgICBrZXlJbnRlcmNlcHRzQWRkcmVzcyA9IGRhdGEua2V5SW50ZXJjZXB0c0FkZHJlc3MsCiAgICAgIGtleVNsb3Blc0FkZHJlc3MgPSBkYXRhLmtleVNsb3Blc0FkZHJlc3MsCiAgICAgIHZhbHVlc0FkZHJlc3MgPSBkYXRhLnZhbHVlc0FkZHJlc3MsCiAgICAgIHZhbHVlSW50ZXJjZXB0c0FkZHJlc3MgPSBkYXRhLnZhbHVlSW50ZXJjZXB0c0FkZHJlc3MsCiAgICAgIHZhbHVlU2xvcGVzQWRkcmVzcyA9IGRhdGEudmFsdWVTbG9wZXNBZGRyZXNzLAogICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgIHF1ZXJ5QWRkcmVzcyA9IGRhdGEucXVlcnlBZGRyZXNzLAogICAgICBuID0gZGF0YS5uOwogICAgdmFyIGFsaWduZWRfYWxsb2MgPSBleHBvcnRzLmFsaWduZWRfYWxsb2MsCiAgICAgIGZyZWUgPSBleHBvcnRzLmZyZWUsCiAgICAgIHB2X3BpY29sbG1fYXR0ZW50aW9uX2VuY29kZV93YXNtID0gZXhwb3J0cy5wdl9waWNvbGxtX2F0dGVudGlvbl9lbmNvZGVfd2FzbSwKICAgICAgcHZfcGljb2xsbV9hdHRlbnRpb25fdXBkYXRlX2tleXNfd2FzbSA9IGV4cG9ydHMucHZfcGljb2xsbV9hdHRlbnRpb25fdXBkYXRlX2tleXNfd2FzbSwKICAgICAgcHZfcGljb2xsbV9hdHRlbnRpb25fdXBkYXRlX3ZhbHVlc193YXNtID0gZXhwb3J0cy5wdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfdmFsdWVzX3dhc20sCiAgICAgIHB2X3BpY29sbG1fYXR0ZW50aW9uX3RyYW5zcG9zZV9xdWVyeV93YXNtID0gZXhwb3J0cy5wdl9waWNvbGxtX2F0dGVudGlvbl90cmFuc3Bvc2VfcXVlcnlfd2FzbSwKICAgICAgcHZfcGljb2xsbV9hdHRlbnRpb25fYXR0ZW5kX3dhc20gPSBleHBvcnRzLnB2X3BpY29sbG1fYXR0ZW50aW9uX2F0dGVuZF93YXNtOwogICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KG5ld0VuY29kaW5nQWRkcmVzcyksCiAgICAgIHdvcmtlckVuY29kaW5nQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICB2YXIgX21lbUFsbG9jJGdldDMgPSBtZW1BbGxvYy5nZXQoa2V5c0FkZHJlc3MpLAogICAgICB3b3JrZXJLZXlzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQzLndvcmtlck1lbUFkZHJlc3M7CiAgICB2YXIgX21lbUFsbG9jJGdldDQgPSBtZW1BbGxvYy5nZXQoa2V5SW50ZXJjZXB0c0FkZHJlc3MpLAogICAgICB3b3JrZXJLZXlJbnRlcmNlcHRzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ0Lndvcmtlck1lbUFkZHJlc3M7CiAgICB2YXIgX21lbUFsbG9jJGdldDUgPSBtZW1BbGxvYy5nZXQoa2V5U2xvcGVzQWRkcmVzcyksCiAgICAgIHdvcmtlcktleVNsb3Blc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NS53b3JrZXJNZW1BZGRyZXNzOwogICAgdmFyIF9tZW1BbGxvYyRnZXQ2ID0gbWVtQWxsb2MuZ2V0KHZhbHVlc0FkZHJlc3MpLAogICAgICB3b3JrZXJWYWx1ZXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDYud29ya2VyTWVtQWRkcmVzczsKICAgIHZhciBfbWVtQWxsb2MkZ2V0NyA9IG1lbUFsbG9jLmdldCh2YWx1ZUludGVyY2VwdHNBZGRyZXNzKSwKICAgICAgd29ya2VyVmFsdWVJbnRlcmNlcHRzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ3Lndvcmtlck1lbUFkZHJlc3M7CiAgICB2YXIgX21lbUFsbG9jJGdldDggPSBtZW1BbGxvYy5nZXQodmFsdWVTbG9wZXNBZGRyZXNzKSwKICAgICAgd29ya2VyVmFsdWVTbG9wZXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDgud29ya2VyTWVtQWRkcmVzczsKICAgIHZhciBfbWVtQWxsb2MkZ2V0OSA9IG1lbUFsbG9jLmdldChxdWVyeUFkZHJlc3MpLAogICAgICB3b3JrZXJRdWVyeUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0OS53b3JrZXJNZW1BZGRyZXNzOwogICAgdmFyIHdvcmtlclFBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHFCdWZmZXIubGVuZ3RoICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgIHZhciB3b3JrZXJLQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBrQnVmZmVyLmxlbmd0aCAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICB2YXIgd29ya2VyVkFkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgdkJ1ZmZlci5sZW5ndGggKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgdmFyIGxlbmd0aCA9IG51bUhlYWRzICogaGVhZERpbWVuc2lvbiAqIG47CiAgICB2YXIgd29ya2VyT3V0cHV0QWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBsZW5ndGggKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgdmFyIG1lbW9yeUJ1ZmZlckZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgbWVtb3J5QnVmZmVyRmxvYXQzMi5zZXQocUJ1ZmZlciwgd29ya2VyUUFkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgbWVtb3J5QnVmZmVyRmxvYXQzMi5zZXQoa0J1ZmZlciwgd29ya2VyS0FkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgbWVtb3J5QnVmZmVyRmxvYXQzMi5zZXQodkJ1ZmZlciwgd29ya2VyVkFkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgbWVtb3J5QnVmZmVyRmxvYXQzMi5maWxsKDAsIHdvcmtlck91dHB1dEFkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHdvcmtlck91dHB1dEFkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKyBsZW5ndGgpOwogICAgcHZfcGljb2xsbV9hdHRlbnRpb25fZW5jb2RlX3dhc20od29ya2VyUUFkZHJlc3MsIHdvcmtlckVuY29kaW5nQWRkcmVzcywgbiwgbnVtSGVhZHMsIHJvcGVJbnRlcmxlYXZlZCwgaGVhZERpbWVuc2lvbiwgcm9wZURpbWVuc2lvbiwgcG9zaXRpb24pOwogICAgcHZfcGljb2xsbV9hdHRlbnRpb25fdHJhbnNwb3NlX3F1ZXJ5X3dhc20obiwgd29ya2VyUUFkZHJlc3MsIHdvcmtlclF1ZXJ5QWRkcmVzcywgbnVtSGVhZHMsIGhlYWREaW1lbnNpb24pOwogICAgcHZfcGljb2xsbV9hdHRlbnRpb25fZW5jb2RlX3dhc20od29ya2VyS0FkZHJlc3MsIHdvcmtlckVuY29kaW5nQWRkcmVzcywgbiwgbnVtS3ZIZWFkcywgcm9wZUludGVybGVhdmVkLCBoZWFkRGltZW5zaW9uLCByb3BlRGltZW5zaW9uLCBwb3NpdGlvbik7CiAgICBwdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfa2V5c193YXNtKG51bUt2SGVhZHMsIHdpbmRvd0xlbmd0aCwgaGVhZERpbWVuc2lvbiwgd29ya2VyS2V5c0FkZHJlc3MsIHdvcmtlcktleUludGVyY2VwdHNBZGRyZXNzLCB3b3JrZXJLZXlTbG9wZXNBZGRyZXNzLCBwb3NpdGlvbiwgbiwgd29ya2VyS0FkZHJlc3MpOwogICAgcHZfcGljb2xsbV9hdHRlbnRpb25fdXBkYXRlX3ZhbHVlc193YXNtKG51bUt2SGVhZHMsIHdpbmRvd0xlbmd0aCwgaGVhZERpbWVuc2lvbiwgd29ya2VyVmFsdWVzQWRkcmVzcywgd29ya2VyVmFsdWVJbnRlcmNlcHRzQWRkcmVzcywgd29ya2VyVmFsdWVTbG9wZXNBZGRyZXNzLCBwb3NpdGlvbiwgbiwgd29ya2VyVkFkZHJlc3MpOwogICAgcHZfcGljb2xsbV9hdHRlbnRpb25fYXR0ZW5kX3dhc20obnVtSGVhZHMsIG51bUt2SGVhZHMsIHdpbmRvd0xlbmd0aCwgaGVhZERpbWVuc2lvbiwgd29ya2VyS2V5c0FkZHJlc3MsIHdvcmtlcktleUludGVyY2VwdHNBZGRyZXNzLCB3b3JrZXJLZXlTbG9wZXNBZGRyZXNzLCB3b3JrZXJWYWx1ZXNBZGRyZXNzLCB3b3JrZXJWYWx1ZUludGVyY2VwdHNBZGRyZXNzLCB3b3JrZXJWYWx1ZVNsb3Blc0FkZHJlc3MsIHBvc2l0aW9uLCB3b3JrZXJRdWVyeUFkZHJlc3MsIG4sIHdvcmtlck91dHB1dEFkZHJlc3MpOwogICAgbWVtb3J5QnVmZmVyRmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICB2YXIgcmVzID0gbWVtb3J5QnVmZmVyRmxvYXQzMi5zbGljZSh3b3JrZXJPdXRwdXRBZGRyZXNzIC8gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCB3b3JrZXJPdXRwdXRBZGRyZXNzIC8gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICsgbGVuZ3RoKTsKICAgIGZyZWUod29ya2VyUUFkZHJlc3MpOwogICAgZnJlZSh3b3JrZXJLQWRkcmVzcyk7CiAgICBmcmVlKHdvcmtlclZBZGRyZXNzKTsKICAgIGZyZWUod29ya2VyT3V0cHV0QWRkcmVzcyk7CiAgICByZXR1cm4gcmVzOwogIH07CiAgdmFyIHB2UGljb2xsbUF0dGVudGlvbkFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbi5BVFRFTlRJT05fUFJFQ09NUFVURV9FTkNPRElORywgYXR0ZW50aW9uUHJlY29tcHV0ZUVuY29kaW5nKSwgUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uLkFUVEVOVElPTl9BVFRFTkRfQ09NQklORUQsIGF0dGVudGlvbkF0dGVuZENvbWJpbmVkKTsKCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCAqLwogIHZhciBQdlBpY29sbG1XZWlnaHRBY3Rpb247CiAgKGZ1bmN0aW9uIChQdlBpY29sbG1XZWlnaHRBY3Rpb24pIHsKICAgIFB2UGljb2xsbVdlaWdodEFjdGlvbltQdlBpY29sbG1XZWlnaHRBY3Rpb25bIldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X1BSRVBST0NFU1NfQkxPQ0tTIl0gPSAxMDBdID0gIldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X1BSRVBST0NFU1NfQkxPQ0tTIjsKICAgIFB2UGljb2xsbVdlaWdodEFjdGlvbltQdlBpY29sbG1XZWlnaHRBY3Rpb25bIldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X1BSRVBST0NFU1NfTUVUQVMiXSA9IDEwMV0gPSAiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfUFJFUFJPQ0VTU19NRVRBUyI7CiAgICBQdlBpY29sbG1XZWlnaHRBY3Rpb25bUHZQaWNvbGxtV2VpZ2h0QWN0aW9uWyJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9QUkVQUk9DRVNTX0JJQVMiXSA9IDEwMl0gPSAiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfUFJFUFJPQ0VTU19CSUFTIjsKICAgIFB2UGljb2xsbVdlaWdodEFjdGlvbltQdlBpY29sbG1XZWlnaHRBY3Rpb25bIldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X0ZPUldBUkRfU0lOR0xFIl0gPSAxMDNdID0gIldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X0ZPUldBUkRfU0lOR0xFIjsKICAgIFB2UGljb2xsbVdlaWdodEFjdGlvbltQdlBpY29sbG1XZWlnaHRBY3Rpb25bIldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X0ZPUldBUkRfTVVMVElQTEUiXSA9IDEwNF0gPSAiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfRk9SV0FSRF9NVUxUSVBMRSI7CiAgfSkoUHZQaWNvbGxtV2VpZ2h0QWN0aW9uIHx8IChQdlBpY29sbG1XZWlnaHRBY3Rpb24gPSB7fSkpOwoKICB2YXIgd2VpZ2h0QmxvY2tNaXhlZDE2eDhQcmVwcm9jZXNzQmxvY2tzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlKGRhdGEpIHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHMsIGV4cG9ydHMsIG1lbUFsbG9jLCBtZW1vcnksIHNoYXBlLCBiaXREZXB0aHMsIGJpdERlcHRoU3RhcnRzLCBudW1CbG9ja0J5dGVzLCBibG9ja3NBZGRyZXNzLCBibG9jaywgYWxpZ25lZF9hbGxvYywgZnJlZSwgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9wcmVwcm9jZXNzX2Jsb2Nrcywgd29ya2VyQmxvY2tzQWRkcmVzcywgc2hhcGVBZGRyZXNzLCBiaXREZXB0aHNBZGRyZXNzLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIG1lbW9yeUJ1ZmZlclVpbnQ4LCBtZW1vcnlCdWZmZXJJbnQzMjsKICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgX2RhdGEkZ2xvYmFscyA9IGRhdGEuZ2xvYmFscywgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMuZXhwb3J0cywgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzLm1lbUFsbG9jLCBtZW1vcnkgPSBfZGF0YSRnbG9iYWxzLm1lbW9yeTsKICAgICAgICAgICAgc2hhcGUgPSBkYXRhLnNoYXBlLCBiaXREZXB0aHMgPSBkYXRhLmJpdERlcHRocywgYml0RGVwdGhTdGFydHMgPSBkYXRhLmJpdERlcHRoU3RhcnRzLCBudW1CbG9ja0J5dGVzID0gZGF0YS5udW1CbG9ja0J5dGVzLCBibG9ja3NBZGRyZXNzID0gZGF0YS5ibG9ja3NBZGRyZXNzLCBibG9jayA9IGRhdGEuYmxvY2s7CiAgICAgICAgICAgIGFsaWduZWRfYWxsb2MgPSBleHBvcnRzLmFsaWduZWRfYWxsb2MsIGZyZWUgPSBleHBvcnRzLmZyZWUsIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfcHJlcHJvY2Vzc19ibG9ja3MgPSBleHBvcnRzLnB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfcHJlcHJvY2Vzc19ibG9ja3M7CiAgICAgICAgICAgIHdvcmtlckJsb2Nrc0FkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIG51bUJsb2NrQnl0ZXMgKiBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgaWYgKHdvcmtlckJsb2Nrc0FkZHJlc3MpIHsKICAgICAgICAgICAgICBtZW1BbGxvYy5zZXQoYmxvY2tzQWRkcmVzcywgewogICAgICAgICAgICAgICAgYWxsb2NTaXplOiBudW1CbG9ja0J5dGVzLAogICAgICAgICAgICAgICAgd29ya2VyTWVtQWRkcmVzczogd29ya2VyQmxvY2tzQWRkcmVzcwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHNoYXBlQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIHNoYXBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgYml0RGVwdGhzQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGJpdERlcHRocy5sZW5ndGgpOwogICAgICAgICAgICAgIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGJpdERlcHRoU3RhcnRzLmxlbmd0aCk7CiAgICAgICAgICAgICAgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4LnNldChibG9jaywgd29ya2VyQmxvY2tzQWRkcmVzcyk7CiAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIuc2V0KHNoYXBlLCBzaGFwZUFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhzLCBiaXREZXB0aHNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIuc2V0KGJpdERlcHRoU3RhcnRzLCBiaXREZXB0aHNTdGFydEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgICBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X3ByZXByb2Nlc3NfYmxvY2tzKHNoYXBlQWRkcmVzcywgYml0RGVwdGhzLmxlbmd0aCwgYml0RGVwdGhzQWRkcmVzcywgYml0RGVwdGhzU3RhcnRBZGRyZXNzLCB3b3JrZXJCbG9ja3NBZGRyZXNzKTsKICAgICAgICAgICAgICBmcmVlKHNoYXBlQWRkcmVzcyk7CiAgICAgICAgICAgICAgZnJlZShiaXREZXB0aHNBZGRyZXNzKTsKICAgICAgICAgICAgICBmcmVlKGJpdERlcHRoc1N0YXJ0QWRkcmVzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgNToKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiB3ZWlnaHRCbG9ja01peGVkMTZ4OFByZXByb2Nlc3NCbG9ja3MoX3gpIHsKICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwogIHZhciB3ZWlnaHRCbG9ja01peGVkMTZ4OFByZXByb2Nlc3NNZXRhcyA9IGZ1bmN0aW9uIHdlaWdodEJsb2NrTWl4ZWQxNng4UHJlcHJvY2Vzc01ldGFzKGRhdGEpIHsKICAgIHZhciBfZGF0YSRnbG9iYWxzMiA9IGRhdGEuZ2xvYmFscywKICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMyLmV4cG9ydHMsCiAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFsczIubWVtQWxsb2MsCiAgICAgIG1lbW9yeSA9IF9kYXRhJGdsb2JhbHMyLm1lbW9yeTsKICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzLAogICAgICBtZXRhcyA9IGRhdGEubWV0YXM7CiAgICB2YXIgYWxpZ25lZF9hbGxvYyA9IGV4cG9ydHMuYWxpZ25lZF9hbGxvYzsKICAgIHZhciB3b3JrZXJNZXRhc0FkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKFVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBtZXRhcy5sZW5ndGggKiBVaW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICBpZiAod29ya2VyTWV0YXNBZGRyZXNzKSB7CiAgICAgIG1lbUFsbG9jLnNldChtZW1BZGRyZXNzLCB7CiAgICAgICAgYWxsb2NTaXplOiBtZXRhcy5sZW5ndGggKiBVaW50MTZBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwKICAgICAgICB3b3JrZXJNZW1BZGRyZXNzOiB3b3JrZXJNZXRhc0FkZHJlc3MKICAgICAgfSk7CiAgICAgIHZhciBtZW1vcnlCdWZmZXJVaW50MTYgPSBuZXcgVWludDE2QXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgIG1lbW9yeUJ1ZmZlclVpbnQxNi5zZXQobWV0YXMsIHdvcmtlck1ldGFzQWRkcmVzcyAvIFVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgIH0KICB9OwogIHZhciB3ZWlnaHRCbG9ja01peGVkMTZ4OFByZXByb2Nlc3NCaWFzID0gZnVuY3Rpb24gd2VpZ2h0QmxvY2tNaXhlZDE2eDhQcmVwcm9jZXNzQmlhcyhkYXRhKSB7CiAgICB2YXIgX2RhdGEkZ2xvYmFsczMgPSBkYXRhLmdsb2JhbHMsCiAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzMy5leHBvcnRzLAogICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMzLm1lbUFsbG9jLAogICAgICBtZW1vcnkgPSBfZGF0YSRnbG9iYWxzMy5tZW1vcnk7CiAgICB2YXIgbWVtQWRkcmVzcyA9IGRhdGEubWVtQWRkcmVzcywKICAgICAgYmlhcyA9IGRhdGEuYmlhczsKICAgIHZhciBhbGlnbmVkX2FsbG9jID0gZXhwb3J0cy5hbGlnbmVkX2FsbG9jOwogICAgdmFyIHdvcmtlckJpYXNBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIGJpYXMubGVuZ3RoICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgIGlmICh3b3JrZXJCaWFzQWRkcmVzcykgewogICAgICBtZW1BbGxvYy5zZXQobWVtQWRkcmVzcywgewogICAgICAgIGFsbG9jU2l6ZTogYmlhcy5sZW5ndGggKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsCiAgICAgICAgd29ya2VyTWVtQWRkcmVzczogd29ya2VyQmlhc0FkZHJlc3MKICAgICAgfSk7CiAgICAgIHZhciBtZW1vcnlCdWZmZXJGbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgbWVtb3J5QnVmZmVyRmxvYXQzMi5zZXQoYmlhcywgd29ya2VyQmlhc0FkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgfQogIH07CiAgdmFyIHdlaWdodEJsb2NrTWl4ZWQxNng4Rm9yd2FyZFNpbmdsZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGRhdGEpIHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHM0LCBleHBvcnRzLCBtZW1BbGxvYywgbWVtb3J5LCBzaGFwZSwgaW5kaWNlc0FkZHJlc3MsIGJpdERlcHRoU3RhcnRzLCBiaXREZXB0aHMsIG1ldGFzQWRkcmVzcywgYmxvY2tzQWRkcmVzcywgeE9mZnNldCwgeEJ1ZmZlciwgYmlhc0FkZHJlc3MsIGFsaWduZWRfYWxsb2MsIGZyZWUsIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfZm9yd2FyZF9zaW5nbGUsIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfYWRkX2JpYXMsIF9tZW1BbGxvYyRnZXQsIHdvcmtlckluZGljZXNBZGRyZXNzLCBfbWVtQWxsb2MkZ2V0Miwgd29ya2VyTWV0YXNBZGRyZXNzLCBfbWVtQWxsb2MkZ2V0Mywgd29ya2VyQmxvY2tzQWRkcmVzcywgc2hhcGVBZGRyZXNzLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIGJpdERlcHRoc0FkZHJlc3MsIHdvcmtlclhBZGRyZXNzLCB3b3JrZXJZQWRkcmVzcywgbWVtb3J5QnVmZmVyRmxvYXQzMiwgbWVtb3J5QnVmZmVySW50MzIsIF9tZW1BbGxvYyRnZXQ0LCB3b3JrZXJCaWFzQWRkcmVzcywgYWxsb2NTaXplLCBkaW1lbnNpb24sIHJlczsKICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIF9kYXRhJGdsb2JhbHM0ID0gZGF0YS5nbG9iYWxzLCBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczQuZXhwb3J0cywgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzNC5tZW1BbGxvYywgbWVtb3J5ID0gX2RhdGEkZ2xvYmFsczQubWVtb3J5OwogICAgICAgICAgICBzaGFwZSA9IGRhdGEuc2hhcGUsIGluZGljZXNBZGRyZXNzID0gZGF0YS5pbmRpY2VzQWRkcmVzcywgYml0RGVwdGhTdGFydHMgPSBkYXRhLmJpdERlcHRoU3RhcnRzLCBiaXREZXB0aHMgPSBkYXRhLmJpdERlcHRocywgbWV0YXNBZGRyZXNzID0gZGF0YS5tZXRhc0FkZHJlc3MsIGJsb2Nrc0FkZHJlc3MgPSBkYXRhLmJsb2Nrc0FkZHJlc3MsIHhPZmZzZXQgPSBkYXRhLnhPZmZzZXQsIHhCdWZmZXIgPSBkYXRhLnhCdWZmZXIsIGJpYXNBZGRyZXNzID0gZGF0YS5iaWFzQWRkcmVzczsKICAgICAgICAgICAgYWxpZ25lZF9hbGxvYyA9IGV4cG9ydHMuYWxpZ25lZF9hbGxvYywgZnJlZSA9IGV4cG9ydHMuZnJlZSwgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9mb3J3YXJkX3NpbmdsZSA9IGV4cG9ydHMucHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9mb3J3YXJkX3NpbmdsZSwgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9hZGRfYmlhcyA9IGV4cG9ydHMucHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9hZGRfYmlhczsKICAgICAgICAgICAgX21lbUFsbG9jJGdldCA9IG1lbUFsbG9jLmdldChpbmRpY2VzQWRkcmVzcyksIHdvcmtlckluZGljZXNBZGRyZXNzID0gX21lbUFsbG9jJGdldC53b3JrZXJNZW1BZGRyZXNzOwogICAgICAgICAgICBfbWVtQWxsb2MkZ2V0MiA9IG1lbUFsbG9jLmdldChtZXRhc0FkZHJlc3MpLCB3b3JrZXJNZXRhc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Mi53b3JrZXJNZW1BZGRyZXNzOwogICAgICAgICAgICBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldChibG9ja3NBZGRyZXNzKSwgd29ya2VyQmxvY2tzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQzLndvcmtlck1lbUFkZHJlc3M7CiAgICAgICAgICAgIHNoYXBlQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIHNoYXBlLmxlbmd0aCk7CiAgICAgICAgICAgIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGJpdERlcHRoU3RhcnRzLmxlbmd0aCk7CiAgICAgICAgICAgIGJpdERlcHRoc0FkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBiaXREZXB0aHMubGVuZ3RoKTsKICAgICAgICAgICAgd29ya2VyWEFkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKDI1NiwgRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogeEJ1ZmZlci5sZW5ndGgpOwogICAgICAgICAgICB3b3JrZXJZQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoMjU2LCBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBzaGFwZVswXSk7CiAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoc2hhcGUsIHNoYXBlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhTdGFydHMsIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhzLCBiaXREZXB0aHNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckZsb2F0MzIuc2V0KHhCdWZmZXIsIHdvcmtlclhBZGRyZXNzIC8gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9mb3J3YXJkX3NpbmdsZShzaGFwZUFkZHJlc3MsIHdvcmtlckluZGljZXNBZGRyZXNzLCBiaXREZXB0aHMubGVuZ3RoLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIGJpdERlcHRoc0FkZHJlc3MsIHdvcmtlck1ldGFzQWRkcmVzcywgd29ya2VyQmxvY2tzQWRkcmVzcywgd29ya2VyWEFkZHJlc3MgKyB4T2Zmc2V0LCB3b3JrZXJZQWRkcmVzcyk7CiAgICAgICAgICAgIGlmIChtZW1BbGxvYy5oYXMoYmlhc0FkZHJlc3MpKSB7CiAgICAgICAgICAgICAgX21lbUFsbG9jJGdldDQgPSBtZW1BbGxvYy5nZXQoYmlhc0FkZHJlc3MpLCB3b3JrZXJCaWFzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ0Lndvcmtlck1lbUFkZHJlc3MsIGFsbG9jU2l6ZSA9IF9tZW1BbGxvYyRnZXQ0LmFsbG9jU2l6ZTsKICAgICAgICAgICAgICBkaW1lbnNpb24gPSBhbGxvY1NpemUgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7CiAgICAgICAgICAgICAgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9hZGRfYmlhcygxLCBkaW1lbnNpb24sIHdvcmtlcllBZGRyZXNzLCB3b3JrZXJCaWFzQWRkcmVzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzID0gbmV3IEZsb2F0MzJBcnJheShtZW1vcnkuYnVmZmVyKS5zbGljZSh3b3JrZXJZQWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgd29ya2VyWUFkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKyBzaGFwZVswXSk7CiAgICAgICAgICAgIGZyZWUoc2hhcGVBZGRyZXNzKTsKICAgICAgICAgICAgZnJlZShiaXREZXB0aHNTdGFydEFkZHJlc3MpOwogICAgICAgICAgICBmcmVlKGJpdERlcHRoc0FkZHJlc3MpOwogICAgICAgICAgICBmcmVlKHdvcmtlclhBZGRyZXNzKTsKICAgICAgICAgICAgZnJlZSh3b3JrZXJZQWRkcmVzcyk7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iLCByZXMpOwogICAgICAgICAgY2FzZSAyNjoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTIpOwogICAgfSkpOwogICAgcmV0dXJuIGZ1bmN0aW9uIHdlaWdodEJsb2NrTWl4ZWQxNng4Rm9yd2FyZFNpbmdsZShfeDIpIHsKICAgICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKICB2YXIgd2VpZ2h0QmxvY2tNaXhlZDE2eDhGb3J3YXJkTXVsdGlwbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhkYXRhKSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzNSwgZXhwb3J0cywgbWVtQWxsb2MsIG1lbW9yeSwgc2hhcGUsIGluZGljZXNBZGRyZXNzLCBiaXREZXB0aFN0YXJ0cywgYml0RGVwdGhzLCBtZXRhc0FkZHJlc3MsIGJsb2Nrc0FkZHJlc3MsIG4sIHhPZmZzZXQsIHhCdWZmZXIsIGJpYXNBZGRyZXNzLCBhbGlnbmVkX2FsbG9jLCBmcmVlLCBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2ZvcndhcmRfbXVsdGlwbGUsIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfYWRkX2JpYXMsIF9tZW1BbGxvYyRnZXQ1LCB3b3JrZXJJbmRpY2VzQWRkcmVzcywgX21lbUFsbG9jJGdldDYsIHdvcmtlck1ldGFzQWRkcmVzcywgX21lbUFsbG9jJGdldDcsIHdvcmtlckJsb2Nrc0FkZHJlc3MsIHNoYXBlQWRkcmVzcywgYml0RGVwdGhzU3RhcnRBZGRyZXNzLCBiaXREZXB0aHNBZGRyZXNzLCB3b3JrZXJYQWRkcmVzcywgd29ya2VyWUFkZHJlc3MsIG1lbW9yeUJ1ZmZlckZsb2F0MzIsIG1lbW9yeUJ1ZmZlckludDMyLCBfbWVtQWxsb2MkZ2V0OCwgd29ya2VyQmlhc0FkZHJlc3MsIGFsbG9jU2l6ZSwgZGltZW5zaW9uLCByZXM7CiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBfZGF0YSRnbG9iYWxzNSA9IGRhdGEuZ2xvYmFscywgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHM1LmV4cG9ydHMsIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFsczUubWVtQWxsb2MsIG1lbW9yeSA9IF9kYXRhJGdsb2JhbHM1Lm1lbW9yeTsKICAgICAgICAgICAgc2hhcGUgPSBkYXRhLnNoYXBlLCBpbmRpY2VzQWRkcmVzcyA9IGRhdGEuaW5kaWNlc0FkZHJlc3MsIGJpdERlcHRoU3RhcnRzID0gZGF0YS5iaXREZXB0aFN0YXJ0cywgYml0RGVwdGhzID0gZGF0YS5iaXREZXB0aHMsIG1ldGFzQWRkcmVzcyA9IGRhdGEubWV0YXNBZGRyZXNzLCBibG9ja3NBZGRyZXNzID0gZGF0YS5ibG9ja3NBZGRyZXNzLCBuID0gZGF0YS5uLCB4T2Zmc2V0ID0gZGF0YS54T2Zmc2V0LCB4QnVmZmVyID0gZGF0YS54QnVmZmVyLCBiaWFzQWRkcmVzcyA9IGRhdGEuYmlhc0FkZHJlc3M7CiAgICAgICAgICAgIGFsaWduZWRfYWxsb2MgPSBleHBvcnRzLmFsaWduZWRfYWxsb2MsIGZyZWUgPSBleHBvcnRzLmZyZWUsIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfZm9yd2FyZF9tdWx0aXBsZSA9IGV4cG9ydHMucHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9mb3J3YXJkX211bHRpcGxlLCBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2FkZF9iaWFzID0gZXhwb3J0cy5wdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2FkZF9iaWFzOwogICAgICAgICAgICBfbWVtQWxsb2MkZ2V0NSA9IG1lbUFsbG9jLmdldChpbmRpY2VzQWRkcmVzcyksIHdvcmtlckluZGljZXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDUud29ya2VyTWVtQWRkcmVzczsKICAgICAgICAgICAgX21lbUFsbG9jJGdldDYgPSBtZW1BbGxvYy5nZXQobWV0YXNBZGRyZXNzKSwgd29ya2VyTWV0YXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDYud29ya2VyTWVtQWRkcmVzczsKICAgICAgICAgICAgX21lbUFsbG9jJGdldDcgPSBtZW1BbGxvYy5nZXQoYmxvY2tzQWRkcmVzcyksIHdvcmtlckJsb2Nrc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Ny53b3JrZXJNZW1BZGRyZXNzOwogICAgICAgICAgICBzaGFwZUFkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBzaGFwZS5sZW5ndGgpOwogICAgICAgICAgICBiaXREZXB0aHNTdGFydEFkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBiaXREZXB0aFN0YXJ0cy5sZW5ndGgpOwogICAgICAgICAgICBiaXREZXB0aHNBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogYml0RGVwdGhzLmxlbmd0aCk7CiAgICAgICAgICAgIHdvcmtlclhBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIHhCdWZmZXIubGVuZ3RoKTsKICAgICAgICAgICAgd29ya2VyWUFkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogKHNoYXBlWzBdICogbikpOwogICAgICAgICAgICBtZW1vcnlCdWZmZXJGbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIuc2V0KHNoYXBlLCBzaGFwZUFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIuc2V0KGJpdERlcHRoU3RhcnRzLCBiaXREZXB0aHNTdGFydEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzIuc2V0KGJpdERlcHRocywgYml0RGVwdGhzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgICBtZW1vcnlCdWZmZXJGbG9hdDMyLnNldCh4QnVmZmVyLCB3b3JrZXJYQWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfZm9yd2FyZF9tdWx0aXBsZShzaGFwZUFkZHJlc3MsIHdvcmtlckluZGljZXNBZGRyZXNzLCBiaXREZXB0aHMubGVuZ3RoLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIGJpdERlcHRoc0FkZHJlc3MsIHdvcmtlck1ldGFzQWRkcmVzcywgd29ya2VyQmxvY2tzQWRkcmVzcywgbiwgd29ya2VyWEFkZHJlc3MgKyB4T2Zmc2V0LCB3b3JrZXJZQWRkcmVzcyk7CiAgICAgICAgICAgIGlmIChtZW1BbGxvYy5oYXMoYmlhc0FkZHJlc3MpKSB7CiAgICAgICAgICAgICAgX21lbUFsbG9jJGdldDggPSBtZW1BbGxvYy5nZXQoYmlhc0FkZHJlc3MpLCB3b3JrZXJCaWFzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ4Lndvcmtlck1lbUFkZHJlc3MsIGFsbG9jU2l6ZSA9IF9tZW1BbGxvYyRnZXQ4LmFsbG9jU2l6ZTsKICAgICAgICAgICAgICBkaW1lbnNpb24gPSBhbGxvY1NpemUgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7CiAgICAgICAgICAgICAgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9hZGRfYmlhcyhuLCBkaW1lbnNpb24sIHdvcmtlcllBZGRyZXNzLCB3b3JrZXJCaWFzQWRkcmVzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzID0gbmV3IEZsb2F0MzJBcnJheShtZW1vcnkuYnVmZmVyKS5zbGljZSh3b3JrZXJZQWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgd29ya2VyWUFkZHJlc3MgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKyBzaGFwZVswXSAqIG4pOwogICAgICAgICAgICBmcmVlKHNoYXBlQWRkcmVzcyk7CiAgICAgICAgICAgIGZyZWUoYml0RGVwdGhzU3RhcnRBZGRyZXNzKTsKICAgICAgICAgICAgZnJlZShiaXREZXB0aHNBZGRyZXNzKTsKICAgICAgICAgICAgZnJlZSh3b3JrZXJYQWRkcmVzcyk7CiAgICAgICAgICAgIGZyZWUod29ya2VyWUFkZHJlc3MpOwogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgcmVzKTsKICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUzKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiB3ZWlnaHRCbG9ja01peGVkMTZ4OEZvcndhcmRNdWx0aXBsZShfeDMpIHsKICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKICB2YXIgcHZQaWNvbGxtV2VpZ2h0QWN0aW9uTWFwID0gX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uLldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X1BSRVBST0NFU1NfQkxPQ0tTLCB3ZWlnaHRCbG9ja01peGVkMTZ4OFByZXByb2Nlc3NCbG9ja3MpLCBQdlBpY29sbG1XZWlnaHRBY3Rpb24uV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfUFJFUFJPQ0VTU19NRVRBUywgd2VpZ2h0QmxvY2tNaXhlZDE2eDhQcmVwcm9jZXNzTWV0YXMpLCBQdlBpY29sbG1XZWlnaHRBY3Rpb24uV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfUFJFUFJPQ0VTU19CSUFTLCB3ZWlnaHRCbG9ja01peGVkMTZ4OFByZXByb2Nlc3NCaWFzKSwgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uLldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X0ZPUldBUkRfU0lOR0xFLCB3ZWlnaHRCbG9ja01peGVkMTZ4OEZvcndhcmRTaW5nbGUpLCBQdlBpY29sbG1XZWlnaHRBY3Rpb24uV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfRk9SV0FSRF9NVUxUSVBMRSwgd2VpZ2h0QmxvY2tNaXhlZDE2eDhGb3J3YXJkTXVsdGlwbGUpOwoKICBmdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH0KICBmdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9CiAgdmFyIGV4cG9ydHMkMTsKICB2YXIgbWVtb3J5OwogIHZhciBtZW1BbGxvYyA9IG5ldyBNYXAoKTsKICBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChhcnJheUJ1ZmZlciwgaW5kZXhTdGFydCkgewogICAgdmFyIGluZGV4RW5kID0gaW5kZXhTdGFydDsKICAgIHdoaWxlIChhcnJheUJ1ZmZlcltpbmRleEVuZF0gIT09IDApIHsKICAgICAgaW5kZXhFbmQrKzsKICAgIH0KICAgIHZhciB1dGY4ZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKTsKICAgIHJldHVybiB1dGY4ZGVjb2Rlci5kZWNvZGUoYXJyYXlCdWZmZXIuc3ViYXJyYXkoaW5kZXhTdGFydCwgaW5kZXhFbmQpKTsKICB9CiAgdmFyIGdldFdhc20gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUod2FzbSkgewogICAgICB2YXIgcHZDb25zb2xlTG9nV2FzbSwgcHZBc3NlcnRXYXNtLCBwdlRpbWVXYXNtLCBwdkZpbGVPcGVuV2FzbSwgcHZGaWxlQ2xvc2VXYXNtLCBwdkZpbGVSZWFkV2FzbSwgcHZGaWxlV3JpdGVXYXNtLCBwdkZpbGVTZWVrV2FzbSwgcHZGaWxlVGVsbFdhc20sIHB2RmlsZVJlbW92ZVdhc20sIGluc3RhbmNlLCBhbGlnbmVkX2FsbG9jLCBhbGlnbmVkQWxsb2M7CiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHB2Q29uc29sZUxvZ1dhc20gPSBmdW5jdGlvbiBwdkNvbnNvbGVMb2dXYXNtKGluZGV4KSB7CiAgICAgICAgICAgICAgaW5kZXggPSB1bnNpZ25lZEFkZHJlc3MoaW5kZXgpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlCiAgICAgICAgICAgICAgY29uc29sZS5sb2coYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGluZGV4KSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2QXNzZXJ0V2FzbSA9IGZ1bmN0aW9uIHB2QXNzZXJ0V2FzbShleHByLCBsaW5lLCBmaWxlTmFtZUFkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlTmFtZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZU5hbWVBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICBpZiAoZXhwciA9PT0gMCkgewogICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGZpbGVOYW1lQWRkcmVzcyk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFzc2VydGlvbiBmYWlsZWQgYXQgbGluZSAiLmNvbmNhdChsaW5lLCAiIGluIFwiIikuY29uY2F0KGZpbGVOYW1lLCAiXCIiKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdlRpbWVXYXNtID0gZnVuY3Rpb24gcHZUaW1lV2FzbSgpIHsKICAgICAgICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCkgLyAxMDAwOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVPcGVuV2FzbSA9IGZ1bmN0aW9uIHB2RmlsZU9wZW5XYXNtKGZpbGVBZGRyZXNzLCBwYXRoQWRkcmVzcywgbW9kZUFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgcGF0aEFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MocGF0aEFkZHJlc3MpOwogICAgICAgICAgICAgIG1vZGVBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKG1vZGVBZGRyZXNzKTsKICAgICAgICAgICAgICBzdGF0dXNBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKHN0YXR1c0FkZHJlc3MpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHZhciBwYXRoID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbW9kZSA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBtb2RlQWRkcmVzcyk7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLm9wZW4ocGF0aCwgbW9kZSk7CiAgICAgICAgICAgICAgICBQdkZpbGVNZW0uc2V0UHRyKGZpbGVBZGRyZXNzLCBmaWxlKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVDbG9zZVdhc20gPSBmdW5jdGlvbiBwdkZpbGVDbG9zZVdhc20oZmlsZUFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgc3RhdHVzQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhzdGF0dXNBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVSZWFkV2FzbSA9IGZ1bmN0aW9uIHB2RmlsZVJlYWRXYXNtKGZpbGVBZGRyZXNzLCBjb250ZW50QWRkcmVzcywgc2l6ZSwgY291bnQsIG51bVJlYWRBZGRyZXNzKSB7CiAgICAgICAgICAgICAgZmlsZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgIGNvbnRlbnRBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKGNvbnRlbnRBZGRyZXNzKTsKICAgICAgICAgICAgICBudW1SZWFkQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhudW1SZWFkQWRkcmVzcyk7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlckludDMyID0gbmV3IEludDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLmdldFB0cihmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IGZpbGUucmVhZChzaXplLCBjb3VudCk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQoY29udGVudCwgY29udGVudEFkZHJlc3MpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtUmVhZEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGNvbnRlbnQubGVuZ3RoIC8gc2l6ZTsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltudW1SZWFkQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVXcml0ZVdhc20gPSBmdW5jdGlvbiBwdkZpbGVXcml0ZVdhc20oZmlsZUFkZHJlc3MsIGNvbnRlbnRBZGRyZXNzLCBzaXplLCBjb3VudCwgbnVtV3JpdGVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgZmlsZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgIGNvbnRlbnRBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKGNvbnRlbnRBZGRyZXNzKTsKICAgICAgICAgICAgICBudW1Xcml0ZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MobnVtV3JpdGVBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIGNvdW50KTsKICAgICAgICAgICAgICAgIGNvbnRlbnQuc2V0KG1lbW9yeUJ1ZmZlclVpbnQ4LnNsaWNlKGNvbnRlbnRBZGRyZXNzLCBjb250ZW50QWRkcmVzcyArIHNpemUgKiBjb3VudCksIDApOwogICAgICAgICAgICAgICAgZmlsZS53cml0ZShjb250ZW50KTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW251bVdyaXRlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gY29udGVudC5sZW5ndGggLyBzaXplOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW251bVdyaXRlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2RmlsZVNlZWtXYXNtID0gZnVuY3Rpb24gcHZGaWxlU2Vla1dhc20oZmlsZUFkZHJlc3MsIG9mZnNldCwgd2hlbmNlLCBzdGF0dXNBZGRyZXNzKSB7CiAgICAgICAgICAgICAgZmlsZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgIHN0YXR1c0FkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3Moc3RhdHVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlckludDMyID0gbmV3IEludDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLmdldFB0cihmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICBmaWxlLnNlZWsob2Zmc2V0LCB3aGVuY2UpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gMDsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAtMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2RmlsZVRlbGxXYXNtID0gZnVuY3Rpb24gcHZGaWxlVGVsbFdhc20oZmlsZUFkZHJlc3MsIG9mZnNldEFkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgb2Zmc2V0QWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhvZmZzZXRBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW29mZnNldEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGZpbGUudGVsbCgpOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW29mZnNldEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZGaWxlUmVtb3ZlV2FzbSA9IGZ1bmN0aW9uIHB2RmlsZVJlbW92ZVdhc20ocGF0aEFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICBwYXRoQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhwYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgc3RhdHVzQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhzdGF0dXNBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB2YXIgcGF0aCA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBwYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLm9wZW4ocGF0aCwgInciKTsKICAgICAgICAgICAgICAgIGZpbGUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyOwogICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUod2FzbSwgewogICAgICAgICAgICAgIHdhc2lfc25hcHNob3RfcHJldmlldzE6IHdhc2lfc25hcHNob3RfcHJldmlldzFfZW11bGF0b3IsCiAgICAgICAgICAgICAgZW52OiB7CiAgICAgICAgICAgICAgICBtZW1vcnk6IG1lbW9yeSwKICAgICAgICAgICAgICAgIHB2X2NvbnNvbGVfbG9nX3dhc206IHB2Q29uc29sZUxvZ1dhc20sCiAgICAgICAgICAgICAgICBwdl9hc3NlcnRfd2FzbTogcHZBc3NlcnRXYXNtLAogICAgICAgICAgICAgICAgcHZfdGltZV93YXNtOiBwdlRpbWVXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9vcGVuX3dhc206IHB2RmlsZU9wZW5XYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9jbG9zZV93YXNtOiBwdkZpbGVDbG9zZVdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3JlYWRfd2FzbTogcHZGaWxlUmVhZFdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3dyaXRlX3dhc206IHB2RmlsZVdyaXRlV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfc2Vla193YXNtOiBwdkZpbGVTZWVrV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfdGVsbF93YXNtOiBwdkZpbGVUZWxsV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfcmVtb3ZlX3dhc206IHB2RmlsZVJlbW92ZVdhc20KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgaW5zdGFuY2UgPSBfY29udGV4dC5zZW50Lmluc3RhbmNlOwogICAgICAgICAgICBhbGlnbmVkX2FsbG9jID0gaW5zdGFuY2UuZXhwb3J0cy5hbGlnbmVkX2FsbG9jOwogICAgICAgICAgICBhbGlnbmVkQWxsb2MgPSBmdW5jdGlvbiBhbGlnbmVkQWxsb2MoYWxpZ25tZW50LCBzaXplKSB7CiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lCiAgICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBhbGlnbmVkX2FsbG9jKGFsaWdubWVudCwgc2l6ZSk7CiAgICAgICAgICAgICAgaWYgKHBvaW50ZXIgPCAwKSB7CiAgICAgICAgICAgICAgICBwb2ludGVyID0gcG9pbnRlciA+Pj4gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHBvaW50ZXI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW5zdGFuY2UuZXhwb3J0cyksIHt9LCB7CiAgICAgICAgICAgICAgYWxpZ25lZF9hbGxvYzogYWxpZ25lZEFsbG9jCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZSk7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gZ2V0V2FzbShfeCkgewogICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgdmFyIGluaXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMihkYXRhKSB7CiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBtZW1vcnkgPSBuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHsKICAgICAgICAgICAgICBpbml0aWFsOiAxMjgKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMzsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc20oZGF0YS53YXNtKTsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgZXhwb3J0cyQxID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUyKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiBpbml0KF94MikgewogICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgfSgpOwogIHZhciBhbGxvY01lbSA9IGZ1bmN0aW9uIGFsbG9jTWVtKGRhdGEpIHsKICAgIHZhciBzaXplID0gZGF0YS5zaXplLAogICAgICBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzOwogICAgdmFyIF9leHBvcnRzID0gZXhwb3J0cyQxLAogICAgICBhbGlnbmVkX2FsbG9jID0gX2V4cG9ydHMuYWxpZ25lZF9hbGxvYzsKICAgIGlmIChzaXplID4gMCkgewogICAgICB2YXIgd29ya2VyTWVtQWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgc2l6ZSAqIFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICBtZW1BbGxvYy5zZXQobWVtQWRkcmVzcywgewogICAgICAgIGFsbG9jU2l6ZTogc2l6ZSwKICAgICAgICB3b3JrZXJNZW1BZGRyZXNzOiB3b3JrZXJNZW1BZGRyZXNzCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIGZyZWVNZW0gPSBmdW5jdGlvbiBmcmVlTWVtKGRhdGEpIHsKICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzOwogICAgdmFyIF9leHBvcnRzMiA9IGV4cG9ydHMkMSwKICAgICAgZnJlZSA9IF9leHBvcnRzMi5mcmVlOwogICAgaWYgKG1lbUFsbG9jLmhhcyhtZW1BZGRyZXNzKSkgewogICAgICB2YXIgX21lbUFsbG9jJGdldCA9IG1lbUFsbG9jLmdldChtZW1BZGRyZXNzKSwKICAgICAgICB3b3JrZXJNZW1BZGRyZXNzID0gX21lbUFsbG9jJGdldC53b3JrZXJNZW1BZGRyZXNzOwogICAgICBmcmVlKHdvcmtlck1lbUFkZHJlc3MpOwogICAgICBtZW1BbGxvY1siZGVsZXRlIl0obWVtQWRkcmVzcyk7CiAgICB9CiAgfTsKICB2YXIgY29weVRvWHB1ID0gZnVuY3Rpb24gY29weVRvWHB1KGRhdGEpIHsKICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzLAogICAgICBvZmZzZXQgPSBkYXRhLm9mZnNldCwKICAgICAgYnVmZmVyID0gZGF0YS5idWZmZXI7CiAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQobWVtQWRkcmVzcyksCiAgICAgIHdvcmtlck1lbUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Mi53b3JrZXJNZW1BZGRyZXNzOwogICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQoYnVmZmVyLCB3b3JrZXJNZW1BZGRyZXNzICsgb2Zmc2V0KTsKICB9OwogIHZhciBjb3B5RnJvbVhwdSA9IGZ1bmN0aW9uIGNvcHlGcm9tWHB1KGRhdGEpIHsKICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzLAogICAgICBvZmZzZXQgPSBkYXRhLm9mZnNldCwKICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTsKICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldChtZW1BZGRyZXNzKSwKICAgICAgd29ya2VyTWVtQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQzLndvcmtlck1lbUFkZHJlc3M7CiAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgIHJldHVybiBtZW1vcnlCdWZmZXJVaW50OC5zbGljZSh3b3JrZXJNZW1BZGRyZXNzICsgb2Zmc2V0LCB3b3JrZXJNZW1BZGRyZXNzICsgb2Zmc2V0ICsgc2l6ZSk7CiAgfTsKICB2YXIgbWVtc2V0ID0gZnVuY3Rpb24gbWVtc2V0KGRhdGEpIHsKICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzLAogICAgICBmaWxsQnl0ZSA9IGRhdGEuZmlsbEJ5dGUsCiAgICAgIHNpemUgPSBkYXRhLnNpemU7CiAgICBpZiAobWVtQWxsb2MuaGFzKG1lbUFkZHJlc3MpKSB7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NCA9IG1lbUFsbG9jLmdldChtZW1BZGRyZXNzKSwKICAgICAgICB3b3JrZXJNZW1BZGRyZXNzID0gX21lbUFsbG9jJGdldDQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgIG1lbW9yeUJ1ZmZlclVpbnQ4LmZpbGwoZmlsbEJ5dGUsIHdvcmtlck1lbUFkZHJlc3MsIHdvcmtlck1lbUFkZHJlc3MgKyBzaXplKTsKICAgIH0KICB9OwogIHZhciB0aW1lclN0YXJ0ID0gZnVuY3Rpb24gdGltZXJTdGFydChkYXRhKSB7CiAgICB2YXIgd29ya2VySW5kZXggPSBkYXRhLndvcmtlckluZGV4OwogICAgdmFyIF9leHBvcnRzMyA9IGV4cG9ydHMkMSwKICAgICAgcHZfcGljb2xsbV90aW1lcl9zdGFydF93YXNtID0gX2V4cG9ydHMzLnB2X3BpY29sbG1fdGltZXJfc3RhcnRfd2FzbTsKICAgIGlmIChwdl9waWNvbGxtX3RpbWVyX3N0YXJ0X3dhc20pIHsKICAgICAgcHZfcGljb2xsbV90aW1lcl9zdGFydF93YXNtKHdvcmtlckluZGV4KTsKICAgIH0KICB9OwogIHZhciB0aW1lclN0b3AgPSBmdW5jdGlvbiB0aW1lclN0b3AoKSB7CiAgICB2YXIgX2V4cG9ydHM0ID0gZXhwb3J0cyQxLAogICAgICBwdl9waWNvbGxtX3RpbWVyX3N0b3Bfd2FzbSA9IF9leHBvcnRzNC5wdl9waWNvbGxtX3RpbWVyX3N0b3Bfd2FzbTsKICAgIGlmIChwdl9waWNvbGxtX3RpbWVyX3N0b3Bfd2FzbSkgewogICAgICBwdl9waWNvbGxtX3RpbWVyX3N0b3Bfd2FzbSgpOwogICAgfQogIH07CiAgdmFyIHhwdUFjdGlvbk1hcCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFB2WHB1QWN0aW9uLklOSVQsIGluaXQpLCBQdlhwdUFjdGlvbi5BTExPQywgYWxsb2NNZW0pLCBQdlhwdUFjdGlvbi5GUkVFLCBmcmVlTWVtKSwgUHZYcHVBY3Rpb24uQ09QWV9UT19YUFUsIGNvcHlUb1hwdSksIFB2WHB1QWN0aW9uLkNPUFlfRlJPTV9YUFUsIGNvcHlGcm9tWHB1KSwgUHZYcHVBY3Rpb24uTUVNU0VULCBtZW1zZXQpLCBQdlhwdUFjdGlvbi5USU1FUl9TVEFSVCwgdGltZXJTdGFydCksIFB2WHB1QWN0aW9uLlRJTUVSX1NUT1AsIHRpbWVyU3RvcCksIHB2TXZtQWN0aW9uTWFwKSwgcHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uTWFwKSwgcHZQaWNvbGxtV2VpZ2h0QWN0aW9uTWFwKTsKICBzZWxmLm9ubWVzc2FnZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKGV2ZW50KSB7CiAgICAgIHZhciByZXM7CiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBpZiAoIShldmVudC5kYXRhLmFjdGlvbiBpbiB4cHVBY3Rpb25NYXApKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBldmVudC5kYXRhLmdsb2JhbHMgPSB7CiAgICAgICAgICAgICAgZXhwb3J0czogZXhwb3J0cyQxLAogICAgICAgICAgICAgIG1lbW9yeTogbWVtb3J5LAogICAgICAgICAgICAgIG1lbUFsbG9jOiBtZW1BbGxvYwogICAgICAgICAgICB9OwogICAgICAgICAgICBfY29udGV4dDMucHJldiA9IDI7CiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNTsKICAgICAgICAgICAgcmV0dXJuIHhwdUFjdGlvbk1hcFtldmVudC5kYXRhLmFjdGlvbl0oZXZlbnQuZGF0YSk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIHJlcyA9IF9jb250ZXh0My5zZW50OwogICAgICAgICAgICBpZiAocmVzKSB7CiAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgICAgICAgICAgd29ya0lkOiBldmVudC5kYXRhLndvcmtJZCwKICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzCiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgICAgICAgfSwgW3Jlcy5idWZmZXJdKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdvaycsCiAgICAgICAgICAgICAgICB3b3JrSWQ6IGV2ZW50LmRhdGEud29ya0lkCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gOTsKICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gX2NvbnRleHQzWyJjYXRjaCJdKDIpOwogICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgICAgICAgIHdvcmtJZDogZXZlbnQuZGF0YS53b3JrSWQsCiAgICAgICAgICAgICAgbWVzc2FnZTogX2NvbnRleHQzLnQwLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDE1OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdmYWlsZWQnLAogICAgICAgICAgICAgIG1lc3NhZ2U6ICJVbnJlY29nbml6ZWQgY29tbWFuZDogIi5jb25jYXQoZXZlbnQuZGF0YS5hY3Rpb24pCiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxNToKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTMsIG51bGwsIFtbMiwgOV1dKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiAoX3gzKSB7CiAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7Cgp9KSgpOwoK', null, false); /* eslint-enable */ var PvXpuAction; @@ -4845,6 +4850,9 @@ var getPicollmWeightWasmFunctions = function getPicollmWeightWasmFunctions(memor _context2.next = 27; break; case 39: + _context2.next = 41; + return Promise.all(workerResults); + case 41: setStatus(statusAddress, 0); PvXpu.addMemory(metasXpuAddress, { objAddress: objAddress, @@ -4853,7 +4861,7 @@ var getPicollmWeightWasmFunctions = function getPicollmWeightWasmFunctions(memor chunkSize: chunkSize, workerSet: blocksMem.workerSet }); - case 41: + case 43: case "end": return _context2.stop(); } @@ -4921,6 +4929,9 @@ var getPicollmWeightWasmFunctions = function getPicollmWeightWasmFunctions(memor _context3.next = 22; break; case 31: + _context3.next = 33; + return Promise.all(workerResults); + case 33: setStatus(statusAddress, 0); PvXpu.addMemory(biasXpuAddress, { objAddress: objAddress, @@ -4929,7 +4940,7 @@ var getPicollmWeightWasmFunctions = function getPicollmWeightWasmFunctions(memor chunkSize: chunkSize, workerSet: blocksMem.workerSet }); - case 33: + case 35: case "end": return _context3.stop(); } @@ -6168,22 +6179,30 @@ var initXpu = function initXpu(memory, xpuHelperWasm) { }(); var pvXpuGraphifiedAlloc = /*#__PURE__*/function () { var _ref14 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee14(alignment, size, addressAddress) { - var addr, memoryBufferInt32; + var addr, memoryBufferInt32, _memoryBufferInt; return _regeneratorRuntime.wrap(function _callee14$(_context14) { while (1) switch (_context14.prev = _context14.next) { case 0: addressAddress = unsignedAddress(addressAddress); - _context14.next = 3; + _context14.prev = 1; + _context14.next = 4; return imports.aligned_alloc(alignment, size); - case 3: + case 4: addr = _context14.sent; memoryBufferInt32 = new Int32Array(memory.buffer); memoryBufferInt32[addressAddress / Int32Array.BYTES_PER_ELEMENT] = addr; - case 6: + _context14.next = 13; + break; + case 9: + _context14.prev = 9; + _context14.t0 = _context14["catch"](1); + _memoryBufferInt = new Int32Array(memory.buffer); + _memoryBufferInt[addressAddress / Int32Array.BYTES_PER_ELEMENT] = 0; + case 13: case "end": return _context14.stop(); } - }, _callee14); + }, _callee14, null, [[1, 9]]); })); return function pvXpuGraphifiedAlloc(_x34, _x35, _x36) { return _ref14.apply(this, arguments); diff --git a/lib/wasm/dist/xpu_web_worker/esm/index.min.js b/lib/wasm/dist/xpu_web_worker/esm/index.min.js index 50bb8c8..5284713 100644 --- a/lib/wasm/dist/xpu_web_worker/esm/index.min.js +++ b/lib/wasm/dist/xpu_web_worker/esm/index.min.js @@ -1,7 +1,7 @@ -function I(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C=0;--A){var t=this.tryEntries[A],c=t.completion;if("root"===t.tryLoc)return C("end");if(t.tryLoc<=this.prev){var i=r.call(t,"catchLoc"),n=r.call(t,"finallyLoc");if(i&&n){if(this.prev=0;--C){var e=this.tryEntries[C];if(e.tryLoc<=this.prev&&r.call(e,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),k(C),G}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var e=C.completion;if("throw"===e.type){var A=e.arg;k(C)}return A}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:F(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=e),G}},A}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(n);var s=(0,n.exports)(),d=s;try{regeneratorRuntime=s}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=s:Function("r","regeneratorRuntime = r")(s)}var a=i(d);const b={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},Z={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},m={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},u={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},G={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class B{static getFirstMatch(I,g){const C=g.match(I);return C&&C.length>0&&C[1]||""}static getSecondMatch(I,g){const C=g.match(I);return C&&C.length>1&&C[2]||""}static matchAndReturnConst(I,g,C){if(I.test(g))return C}static getWindowsVersionName(I){switch(I){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}static getMacOSVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),10===g[0])switch(g[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}static getAndroidVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),!(1===g[0]&&g[1]<5))return 1===g[0]&&g[1]<6?"Cupcake":1===g[0]&&g[1]>=6?"Donut":2===g[0]&&g[1]<2?"Eclair":2===g[0]&&2===g[1]?"Froyo":2===g[0]&&g[1]>2?"Gingerbread":3===g[0]?"Honeycomb":4===g[0]&&g[1]<1?"Ice Cream Sandwich":4===g[0]&&g[1]<4?"Jelly Bean":4===g[0]&&g[1]>=4?"KitKat":5===g[0]?"Lollipop":6===g[0]?"Marshmallow":7===g[0]?"Nougat":8===g[0]?"Oreo":9===g[0]?"Pie":void 0}static getVersionPrecision(I){return I.split(".").length}static compareVersions(I,g,C=!1){const e=B.getVersionPrecision(I),A=B.getVersionPrecision(g);let t=Math.max(e,A),r=0;const c=B.map([I,g],(I=>{const g=t-B.getVersionPrecision(I),C=I+new Array(g+1).join(".0");return B.map(C.split("."),(I=>new Array(20-I.length).join("0")+I)).reverse()}));for(C&&(r=t-Math.min(e,A)),t-=1;t>=r;){if(c[0][t]>c[1][t])return 1;if(c[0][t]===c[1][t]){if(t===r)return 0;t-=1}else if(c[0][t]{C[g]=I[g]}))}}return I}static getBrowserAlias(I){return b[I]}static getBrowserTypeByAlias(I){return Z[I]||""}}const y=/version\/(\d+(\.?_?\d+)+)/i,V=[{test:[/googlebot/i],describe(I){const g={name:"Googlebot"},C=B.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/opera/i],describe(I){const g={name:"Opera"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opr\/|opios/i],describe(I){const g={name:"Opera"},C=B.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/SamsungBrowser/i],describe(I){const g={name:"Samsung Internet for Android"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Whale/i],describe(I){const g={name:"NAVER Whale Browser"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MZBrowser/i],describe(I){const g={name:"MZ Browser"},C=B.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/focus/i],describe(I){const g={name:"Focus"},C=B.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/swing/i],describe(I){const g={name:"Swing"},C=B.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/coast/i],describe(I){const g={name:"Opera Coast"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(I){const g={name:"Opera Touch"},C=B.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/yabrowser/i],describe(I){const g={name:"Yandex Browser"},C=B.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/ucbrowser/i],describe(I){const g={name:"UC Browser"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Maxthon|mxios/i],describe(I){const g={name:"Maxthon"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/epiphany/i],describe(I){const g={name:"Epiphany"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/puffin/i],describe(I){const g={name:"Puffin"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sleipnir/i],describe(I){const g={name:"Sleipnir"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/k-meleon/i],describe(I){const g={name:"K-Meleon"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/micromessenger/i],describe(I){const g={name:"WeChat"},C=B.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/qqbrowser/i],describe(I){const g={name:/qqbrowserlite/i.test(I)?"QQ Browser Lite":"QQ Browser"},C=B.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/msie|trident/i],describe(I){const g={name:"Internet Explorer"},C=B.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/\sedg\//i],describe(I){const g={name:"Microsoft Edge"},C=B.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/edg([ea]|ios)/i],describe(I){const g={name:"Microsoft Edge"},C=B.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/vivaldi/i],describe(I){const g={name:"Vivaldi"},C=B.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/seamonkey/i],describe(I){const g={name:"SeaMonkey"},C=B.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sailfish/i],describe(I){const g={name:"Sailfish"},C=B.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,I);return C&&(g.version=C),g}},{test:[/silk/i],describe(I){const g={name:"Amazon Silk"},C=B.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/phantom/i],describe(I){const g={name:"PhantomJS"},C=B.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/slimerjs/i],describe(I){const g={name:"SlimerJS"},C=B.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g={name:"BlackBerry"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(web|hpw)[o0]s/i],describe(I){const g={name:"WebOS Browser"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/bada/i],describe(I){const g={name:"Bada"},C=B.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/tizen/i],describe(I){const g={name:"Tizen"},C=B.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/qupzilla/i],describe(I){const g={name:"QupZilla"},C=B.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/firefox|iceweasel|fxios/i],describe(I){const g={name:"Firefox"},C=B.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/electron/i],describe(I){const g={name:"Electron"},C=B.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MiuiBrowser/i],describe(I){const g={name:"Miui"},C=B.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/chromium/i],describe(I){const g={name:"Chromium"},C=B.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/chrome|crios|crmo/i],describe(I){const g={name:"Chrome"},C=B.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/GSA/i],describe(I){const g={name:"Google Search"},C=B.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g={name:"Android Browser"},C=B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/playstation 4/i],describe(I){const g={name:"PlayStation 4"},C=B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/safari|applewebkit/i],describe(I){const g={name:"Safari"},C=B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/.*/i],describe(I){const g=-1!==I.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:B.getFirstMatch(g,I),version:B.getSecondMatch(g,I)}}}];var W=[{test:[/Roku\/DVP/],describe(I){const g=B.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,I);return{name:u.Roku,version:g}}},{test:[/windows phone/i],describe(I){const g=B.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,I);return{name:u.WindowsPhone,version:g}}},{test:[/windows /i],describe(I){const g=B.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,I),C=B.getWindowsVersionName(g);return{name:u.Windows,version:g,versionName:C}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(I){const g={name:u.iOS},C=B.getSecondMatch(/(Version\/)(\d[\d.]+)/,I);return C&&(g.version=C),g}},{test:[/macintosh/i],describe(I){const g=B.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,I).replace(/[_\s]/g,"."),C=B.getMacOSVersionName(g),e={name:u.MacOS,version:g};return C&&(e.versionName=C),e}},{test:[/(ipod|iphone|ipad)/i],describe(I){const g=B.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,I).replace(/[_\s]/g,".");return{name:u.iOS,version:g}}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g=B.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,I),C=B.getAndroidVersionName(g),e={name:u.Android,version:g};return C&&(e.versionName=C),e}},{test:[/(web|hpw)[o0]s/i],describe(I){const g=B.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,I),C={name:u.WebOS};return g&&g.length&&(C.version=g),C}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g=B.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,I)||B.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,I)||B.getFirstMatch(/\bbb(\d+)/i,I);return{name:u.BlackBerry,version:g}}},{test:[/bada/i],describe(I){const g=B.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,I);return{name:u.Bada,version:g}}},{test:[/tizen/i],describe(I){const g=B.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,I);return{name:u.Tizen,version:g}}},{test:[/linux/i],describe:()=>({name:u.Linux})},{test:[/CrOS/],describe:()=>({name:u.ChromeOS})},{test:[/PlayStation 4/],describe(I){const g=B.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,I);return{name:u.PlayStation4,version:g}}}],h=[{test:[/googlebot/i],describe:()=>({type:"bot",vendor:"Google"})},{test:[/huawei/i],describe(I){const g=B.getFirstMatch(/(can-l01)/i,I)&&"Nova",C={type:m.mobile,vendor:"Huawei"};return g&&(C.model=g),C}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:()=>({type:m.tablet,vendor:"Nexus"})},{test:[/ipad/i],describe:()=>({type:m.tablet,vendor:"Apple",model:"iPad"})},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:()=>({type:m.tablet,vendor:"Apple",model:"iPad"})},{test:[/kftt build/i],describe:()=>({type:m.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"})},{test:[/silk/i],describe:()=>({type:m.tablet,vendor:"Amazon"})},{test:[/tablet(?! pc)/i],describe:()=>({type:m.tablet})},{test(I){const g=I.test(/ipod|iphone/i),C=I.test(/like (ipod|iphone)/i);return g&&!C},describe(I){const g=B.getFirstMatch(/(ipod|iphone)/i,I);return{type:m.mobile,vendor:"Apple",model:g}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:()=>({type:m.mobile,vendor:"Nexus"})},{test:[/[^-]mobi/i],describe:()=>({type:m.mobile})},{test:I=>"blackberry"===I.getBrowserName(!0),describe:()=>({type:m.mobile,vendor:"BlackBerry"})},{test:I=>"bada"===I.getBrowserName(!0),describe:()=>({type:m.mobile})},{test:I=>"windows phone"===I.getBrowserName(),describe:()=>({type:m.mobile,vendor:"Microsoft"})},{test(I){const g=Number(String(I.getOSVersion()).split(".")[0]);return"android"===I.getOSName(!0)&&g>=3},describe:()=>({type:m.tablet})},{test:I=>"android"===I.getOSName(!0),describe:()=>({type:m.mobile})},{test:I=>"macos"===I.getOSName(!0),describe:()=>({type:m.desktop,vendor:"Apple"})},{test:I=>"windows"===I.getOSName(!0),describe:()=>({type:m.desktop})},{test:I=>"linux"===I.getOSName(!0),describe:()=>({type:m.desktop})},{test:I=>"playstation 4"===I.getOSName(!0),describe:()=>({type:m.tv})},{test:I=>"roku"===I.getOSName(!0),describe:()=>({type:m.tv})}],R=[{test:I=>"microsoft edge"===I.getBrowserName(!0),describe(I){if(/\sedg\//i.test(I))return{name:G.Blink};const g=B.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,I);return{name:G.EdgeHTML,version:g}}},{test:[/trident/i],describe(I){const g={name:G.Trident},C=B.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:I=>I.test(/presto/i),describe(I){const g={name:G.Presto},C=B.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=I.test(/gecko/i),C=I.test(/like gecko/i);return g&&!C},describe(I){const g={name:G.Gecko},C=B.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(apple)?webkit\/537\.36/i],describe:()=>({name:G.Blink})},{test:[/(apple)?webkit/i],describe(I){const g={name:G.WebKit},C=B.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}}];class X{constructor(I,g=!1){if(null==I||""===I)throw new Error("UserAgent parameter can't be empty");this._ua=I,this.parsedResult={},!0!==g&&this.parse()}getUA(){return this._ua}test(I){return I.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const I=B.find(V,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.browser=I.describe(this.getUA())),this.parsedResult.browser}getBrowser(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}getBrowserName(I){return I?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}parseOS(){this.parsedResult.os={};const I=B.find(W,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.os=I.describe(this.getUA())),this.parsedResult.os}getOSName(I){const{name:g}=this.getOS();return I?String(g).toLowerCase()||"":g||""}getOSVersion(){return this.getOS().version}getPlatform(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}getPlatformType(I=!1){const{type:g}=this.getPlatform();return I?String(g).toLowerCase()||"":g||""}parsePlatform(){this.parsedResult.platform={};const I=B.find(h,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.platform=I.describe(this.getUA())),this.parsedResult.platform}getEngine(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}getEngineName(I){return I?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const I=B.find(R,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.engine=I.describe(this.getUA())),this.parsedResult.engine}parse(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}getResult(){return B.assign({},this.parsedResult)}satisfies(I){const g={};let C=0;const e={};let A=0;if(Object.keys(I).forEach((t=>{const r=I[t];"string"==typeof r?(e[t]=r,A+=1):"object"==typeof r&&(g[t]=r,C+=1)})),C>0){const I=Object.keys(g),C=B.find(I,(I=>this.isOS(I)));if(C){const I=this.satisfies(g[C]);if(void 0!==I)return I}const e=B.find(I,(I=>this.isPlatform(I)));if(e){const I=this.satisfies(g[e]);if(void 0!==I)return I}}if(A>0){const I=Object.keys(e),g=B.find(I,(I=>this.isBrowser(I,!0)));if(void 0!==g)return this.compareVersion(e[g])}}isBrowser(I,g=!1){const C=this.getBrowserName().toLowerCase();let e=I.toLowerCase();const A=B.getBrowserTypeByAlias(e);return g&&A&&(e=A.toLowerCase()),e===C}compareVersion(I){let g=[0],C=I,e=!1;const A=this.getBrowserVersion();if("string"==typeof A)return">"===I[0]||"<"===I[0]?(C=I.substr(1),"="===I[1]?(e=!0,C=I.substr(2)):g=[],">"===I[0]?g.push(1):g.push(-1)):"="===I[0]?C=I.substr(1):"~"===I[0]&&(e=!0,C=I.substr(1)),g.indexOf(B.compareVersions(A,C,e))>-1}isOS(I){return this.getOSName(!0)===String(I).toLowerCase()}isPlatform(I){return this.getPlatformType(!0)===String(I).toLowerCase()}isEngine(I){return this.getEngineName(!0)===String(I).toLowerCase()}is(I,g=!1){return this.isBrowser(I,g)||this.isOS(I)||this.isPlatform(I)}some(I=[]){return I.some((I=>this.is(I)))}} +function I(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C=0;--A){var t=this.tryEntries[A],c=t.completion;if("root"===t.tryLoc)return C("end");if(t.tryLoc<=this.prev){var i=r.call(t,"catchLoc"),n=r.call(t,"finallyLoc");if(i&&n){if(this.prev=0;--C){var e=this.tryEntries[C];if(e.tryLoc<=this.prev&&r.call(e,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),w(C),B}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var e=C.completion;if("throw"===e.type){var A=e.arg;w(C)}return A}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:F(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=e),B}},A}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(n);var s=(0,n.exports)(),a=s;try{regeneratorRuntime=s}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=s:Function("r","regeneratorRuntime = r")(s)}var d=i(a);const b={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},Z={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},m={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},u={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},B={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class y{static getFirstMatch(I,g){const C=g.match(I);return C&&C.length>0&&C[1]||""}static getSecondMatch(I,g){const C=g.match(I);return C&&C.length>1&&C[2]||""}static matchAndReturnConst(I,g,C){if(I.test(g))return C}static getWindowsVersionName(I){switch(I){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}static getMacOSVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),10===g[0])switch(g[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}static getAndroidVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),!(1===g[0]&&g[1]<5))return 1===g[0]&&g[1]<6?"Cupcake":1===g[0]&&g[1]>=6?"Donut":2===g[0]&&g[1]<2?"Eclair":2===g[0]&&2===g[1]?"Froyo":2===g[0]&&g[1]>2?"Gingerbread":3===g[0]?"Honeycomb":4===g[0]&&g[1]<1?"Ice Cream Sandwich":4===g[0]&&g[1]<4?"Jelly Bean":4===g[0]&&g[1]>=4?"KitKat":5===g[0]?"Lollipop":6===g[0]?"Marshmallow":7===g[0]?"Nougat":8===g[0]?"Oreo":9===g[0]?"Pie":void 0}static getVersionPrecision(I){return I.split(".").length}static compareVersions(I,g,C=!1){const e=y.getVersionPrecision(I),A=y.getVersionPrecision(g);let t=Math.max(e,A),r=0;const c=y.map([I,g],(I=>{const g=t-y.getVersionPrecision(I),C=I+new Array(g+1).join(".0");return y.map(C.split("."),(I=>new Array(20-I.length).join("0")+I)).reverse()}));for(C&&(r=t-Math.min(e,A)),t-=1;t>=r;){if(c[0][t]>c[1][t])return 1;if(c[0][t]===c[1][t]){if(t===r)return 0;t-=1}else if(c[0][t]{C[g]=I[g]}))}}return I}static getBrowserAlias(I){return b[I]}static getBrowserTypeByAlias(I){return Z[I]||""}}const G=/version\/(\d+(\.?_?\d+)+)/i,V=[{test:[/googlebot/i],describe(I){const g={name:"Googlebot"},C=y.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/opera/i],describe(I){const g={name:"Opera"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opr\/|opios/i],describe(I){const g={name:"Opera"},C=y.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/SamsungBrowser/i],describe(I){const g={name:"Samsung Internet for Android"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Whale/i],describe(I){const g={name:"NAVER Whale Browser"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MZBrowser/i],describe(I){const g={name:"MZ Browser"},C=y.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/focus/i],describe(I){const g={name:"Focus"},C=y.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/swing/i],describe(I){const g={name:"Swing"},C=y.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/coast/i],describe(I){const g={name:"Opera Coast"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(I){const g={name:"Opera Touch"},C=y.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/yabrowser/i],describe(I){const g={name:"Yandex Browser"},C=y.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/ucbrowser/i],describe(I){const g={name:"UC Browser"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Maxthon|mxios/i],describe(I){const g={name:"Maxthon"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/epiphany/i],describe(I){const g={name:"Epiphany"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/puffin/i],describe(I){const g={name:"Puffin"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sleipnir/i],describe(I){const g={name:"Sleipnir"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/k-meleon/i],describe(I){const g={name:"K-Meleon"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/micromessenger/i],describe(I){const g={name:"WeChat"},C=y.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/qqbrowser/i],describe(I){const g={name:/qqbrowserlite/i.test(I)?"QQ Browser Lite":"QQ Browser"},C=y.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/msie|trident/i],describe(I){const g={name:"Internet Explorer"},C=y.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/\sedg\//i],describe(I){const g={name:"Microsoft Edge"},C=y.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/edg([ea]|ios)/i],describe(I){const g={name:"Microsoft Edge"},C=y.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/vivaldi/i],describe(I){const g={name:"Vivaldi"},C=y.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/seamonkey/i],describe(I){const g={name:"SeaMonkey"},C=y.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sailfish/i],describe(I){const g={name:"Sailfish"},C=y.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,I);return C&&(g.version=C),g}},{test:[/silk/i],describe(I){const g={name:"Amazon Silk"},C=y.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/phantom/i],describe(I){const g={name:"PhantomJS"},C=y.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/slimerjs/i],describe(I){const g={name:"SlimerJS"},C=y.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g={name:"BlackBerry"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(web|hpw)[o0]s/i],describe(I){const g={name:"WebOS Browser"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/bada/i],describe(I){const g={name:"Bada"},C=y.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/tizen/i],describe(I){const g={name:"Tizen"},C=y.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/qupzilla/i],describe(I){const g={name:"QupZilla"},C=y.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/firefox|iceweasel|fxios/i],describe(I){const g={name:"Firefox"},C=y.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/electron/i],describe(I){const g={name:"Electron"},C=y.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MiuiBrowser/i],describe(I){const g={name:"Miui"},C=y.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/chromium/i],describe(I){const g={name:"Chromium"},C=y.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/chrome|crios|crmo/i],describe(I){const g={name:"Chrome"},C=y.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/GSA/i],describe(I){const g={name:"Google Search"},C=y.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g={name:"Android Browser"},C=y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/playstation 4/i],describe(I){const g={name:"PlayStation 4"},C=y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/safari|applewebkit/i],describe(I){const g={name:"Safari"},C=y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/.*/i],describe(I){const g=-1!==I.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:y.getFirstMatch(g,I),version:y.getSecondMatch(g,I)}}}];var h=[{test:[/Roku\/DVP/],describe(I){const g=y.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,I);return{name:u.Roku,version:g}}},{test:[/windows phone/i],describe(I){const g=y.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,I);return{name:u.WindowsPhone,version:g}}},{test:[/windows /i],describe(I){const g=y.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,I),C=y.getWindowsVersionName(g);return{name:u.Windows,version:g,versionName:C}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(I){const g={name:u.iOS},C=y.getSecondMatch(/(Version\/)(\d[\d.]+)/,I);return C&&(g.version=C),g}},{test:[/macintosh/i],describe(I){const g=y.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,I).replace(/[_\s]/g,"."),C=y.getMacOSVersionName(g),e={name:u.MacOS,version:g};return C&&(e.versionName=C),e}},{test:[/(ipod|iphone|ipad)/i],describe(I){const g=y.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,I).replace(/[_\s]/g,".");return{name:u.iOS,version:g}}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g=y.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,I),C=y.getAndroidVersionName(g),e={name:u.Android,version:g};return C&&(e.versionName=C),e}},{test:[/(web|hpw)[o0]s/i],describe(I){const g=y.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,I),C={name:u.WebOS};return g&&g.length&&(C.version=g),C}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g=y.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,I)||y.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,I)||y.getFirstMatch(/\bbb(\d+)/i,I);return{name:u.BlackBerry,version:g}}},{test:[/bada/i],describe(I){const g=y.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,I);return{name:u.Bada,version:g}}},{test:[/tizen/i],describe(I){const g=y.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,I);return{name:u.Tizen,version:g}}},{test:[/linux/i],describe:()=>({name:u.Linux})},{test:[/CrOS/],describe:()=>({name:u.ChromeOS})},{test:[/PlayStation 4/],describe(I){const g=y.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,I);return{name:u.PlayStation4,version:g}}}],W=[{test:[/googlebot/i],describe:()=>({type:"bot",vendor:"Google"})},{test:[/huawei/i],describe(I){const g=y.getFirstMatch(/(can-l01)/i,I)&&"Nova",C={type:m.mobile,vendor:"Huawei"};return g&&(C.model=g),C}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:()=>({type:m.tablet,vendor:"Nexus"})},{test:[/ipad/i],describe:()=>({type:m.tablet,vendor:"Apple",model:"iPad"})},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:()=>({type:m.tablet,vendor:"Apple",model:"iPad"})},{test:[/kftt build/i],describe:()=>({type:m.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"})},{test:[/silk/i],describe:()=>({type:m.tablet,vendor:"Amazon"})},{test:[/tablet(?! pc)/i],describe:()=>({type:m.tablet})},{test(I){const g=I.test(/ipod|iphone/i),C=I.test(/like (ipod|iphone)/i);return g&&!C},describe(I){const g=y.getFirstMatch(/(ipod|iphone)/i,I);return{type:m.mobile,vendor:"Apple",model:g}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:()=>({type:m.mobile,vendor:"Nexus"})},{test:[/[^-]mobi/i],describe:()=>({type:m.mobile})},{test:I=>"blackberry"===I.getBrowserName(!0),describe:()=>({type:m.mobile,vendor:"BlackBerry"})},{test:I=>"bada"===I.getBrowserName(!0),describe:()=>({type:m.mobile})},{test:I=>"windows phone"===I.getBrowserName(),describe:()=>({type:m.mobile,vendor:"Microsoft"})},{test(I){const g=Number(String(I.getOSVersion()).split(".")[0]);return"android"===I.getOSName(!0)&&g>=3},describe:()=>({type:m.tablet})},{test:I=>"android"===I.getOSName(!0),describe:()=>({type:m.mobile})},{test:I=>"macos"===I.getOSName(!0),describe:()=>({type:m.desktop,vendor:"Apple"})},{test:I=>"windows"===I.getOSName(!0),describe:()=>({type:m.desktop})},{test:I=>"linux"===I.getOSName(!0),describe:()=>({type:m.desktop})},{test:I=>"playstation 4"===I.getOSName(!0),describe:()=>({type:m.tv})},{test:I=>"roku"===I.getOSName(!0),describe:()=>({type:m.tv})}],R=[{test:I=>"microsoft edge"===I.getBrowserName(!0),describe(I){if(/\sedg\//i.test(I))return{name:B.Blink};const g=y.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,I);return{name:B.EdgeHTML,version:g}}},{test:[/trident/i],describe(I){const g={name:B.Trident},C=y.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:I=>I.test(/presto/i),describe(I){const g={name:B.Presto},C=y.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=I.test(/gecko/i),C=I.test(/like gecko/i);return g&&!C},describe(I){const g={name:B.Gecko},C=y.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(apple)?webkit\/537\.36/i],describe:()=>({name:B.Blink})},{test:[/(apple)?webkit/i],describe(I){const g={name:B.WebKit},C=y.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}}];class p{constructor(I,g=!1){if(null==I||""===I)throw new Error("UserAgent parameter can't be empty");this._ua=I,this.parsedResult={},!0!==g&&this.parse()}getUA(){return this._ua}test(I){return I.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const I=y.find(V,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.browser=I.describe(this.getUA())),this.parsedResult.browser}getBrowser(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}getBrowserName(I){return I?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}parseOS(){this.parsedResult.os={};const I=y.find(h,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.os=I.describe(this.getUA())),this.parsedResult.os}getOSName(I){const{name:g}=this.getOS();return I?String(g).toLowerCase()||"":g||""}getOSVersion(){return this.getOS().version}getPlatform(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}getPlatformType(I=!1){const{type:g}=this.getPlatform();return I?String(g).toLowerCase()||"":g||""}parsePlatform(){this.parsedResult.platform={};const I=y.find(W,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.platform=I.describe(this.getUA())),this.parsedResult.platform}getEngine(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}getEngineName(I){return I?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const I=y.find(R,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.engine=I.describe(this.getUA())),this.parsedResult.engine}parse(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}getResult(){return y.assign({},this.parsedResult)}satisfies(I){const g={};let C=0;const e={};let A=0;if(Object.keys(I).forEach((t=>{const r=I[t];"string"==typeof r?(e[t]=r,A+=1):"object"==typeof r&&(g[t]=r,C+=1)})),C>0){const I=Object.keys(g),C=y.find(I,(I=>this.isOS(I)));if(C){const I=this.satisfies(g[C]);if(void 0!==I)return I}const e=y.find(I,(I=>this.isPlatform(I)));if(e){const I=this.satisfies(g[e]);if(void 0!==I)return I}}if(A>0){const I=Object.keys(e),g=y.find(I,(I=>this.isBrowser(I,!0)));if(void 0!==g)return this.compareVersion(e[g])}}isBrowser(I,g=!1){const C=this.getBrowserName().toLowerCase();let e=I.toLowerCase();const A=y.getBrowserTypeByAlias(e);return g&&A&&(e=A.toLowerCase()),e===C}compareVersion(I){let g=[0],C=I,e=!1;const A=this.getBrowserVersion();if("string"==typeof A)return">"===I[0]||"<"===I[0]?(C=I.substr(1),"="===I[1]?(e=!0,C=I.substr(2)):g=[],">"===I[0]?g.push(1):g.push(-1)):"="===I[0]?C=I.substr(1):"~"===I[0]&&(e=!0,C=I.substr(1)),g.indexOf(y.compareVersions(A,C,e))>-1}isOS(I){return this.getOSName(!0)===String(I).toLowerCase()}isPlatform(I){return this.getPlatformType(!0)===String(I).toLowerCase()}isEngine(I){return this.getEngineName(!0)===String(I).toLowerCase()}is(I,g=!1){return this.isBrowser(I,g)||this.isOS(I)||this.isPlatform(I)}some(I=[]){return I.some((I=>this.is(I)))}} /*! * Bowser - a browser detector * https://github.com/lancedikson/bowser * MIT License | (c) Dustin Diaz 2012-2015 * MIT License | (c) Denis Demchenko 2015-2019 - */class p{static getParser(I,g=!1){if("string"!=typeof I)throw new Error("UserAgent should be a string");return new X(I,g)}static parse(I){return new X(I).getResult()}static get BROWSER_MAP(){return Z}static get ENGINE_MAP(){return G}static get OS_MAP(){return u}static get PLATFORMS_MAP(){return m}}var H={exports:{}},J={exports:{}};!function(I){function g(C){return I.exports=g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},I.exports.__esModule=!0,I.exports.default=I.exports,g(C)}I.exports=g,I.exports.__esModule=!0,I.exports.default=I.exports}(J);var S=J.exports;!function(I){var g=S.default;function C(){I.exports=C=function(){return A},I.exports.__esModule=!0,I.exports.default=I.exports;var e,A={},t=Object.prototype,r=t.hasOwnProperty,c=Object.defineProperty||function(I,g,C){I[g]=C.value},i="function"==typeof Symbol?Symbol:{},n=i.iterator||"@@iterator",l=i.asyncIterator||"@@asyncIterator",o=i.toStringTag||"@@toStringTag";function s(I,g,C){return Object.defineProperty(I,g,{value:C,enumerable:!0,configurable:!0,writable:!0}),I[g]}try{s({},"")}catch(e){s=function(I,g,C){return I[g]=C}}function d(I,g,C,e){var A=g&&g.prototype instanceof B?g:B,t=Object.create(A.prototype),r=new f(e||[]);return c(t,"_invoke",{value:J(I,C,r)}),t}function a(I,g,C){try{return{type:"normal",arg:I.call(g,C)}}catch(I){return{type:"throw",arg:I}}}A.wrap=d;var b="suspendedStart",Z="suspendedYield",m="executing",u="completed",G={};function B(){}function y(){}function V(){}var W={};s(W,n,(function(){return this}));var h=Object.getPrototypeOf,R=h&&h(h(F([])));R&&R!==t&&r.call(R,n)&&(W=R);var X=V.prototype=B.prototype=Object.create(W);function p(I){["next","throw","return"].forEach((function(g){s(I,g,(function(I){return this._invoke(g,I)}))}))}function H(I,C){function e(A,t,c,i){var n=a(I[A],I,t);if("throw"!==n.type){var l=n.arg,o=l.value;return o&&"object"==g(o)&&r.call(o,"__await")?C.resolve(o.__await).then((function(I){e("next",I,c,i)}),(function(I){e("throw",I,c,i)})):C.resolve(o).then((function(I){l.value=I,c(l)}),(function(I){return e("throw",I,c,i)}))}i(n.arg)}var A;c(this,"_invoke",{value:function(I,g){function t(){return new C((function(C,A){e(I,g,C,A)}))}return A=A?A.then(t,t):t()}})}function J(I,g,C){var A=b;return function(t,r){if(A===m)throw new Error("Generator is already running");if(A===u){if("throw"===t)throw r;return{value:e,done:!0}}for(C.method=t,C.arg=r;;){var c=C.delegate;if(c){var i=S(c,C);if(i){if(i===G)continue;return i}}if("next"===C.method)C.sent=C._sent=C.arg;else if("throw"===C.method){if(A===b)throw A=u,C.arg;C.dispatchException(C.arg)}else"return"===C.method&&C.abrupt("return",C.arg);A=m;var n=a(I,g,C);if("normal"===n.type){if(A=C.done?u:Z,n.arg===G)continue;return{value:n.arg,done:C.done}}"throw"===n.type&&(A=u,C.method="throw",C.arg=n.arg)}}}function S(I,g){var C=g.method,A=I.iterator[C];if(A===e)return g.delegate=null,"throw"===C&&I.iterator.return&&(g.method="return",g.arg=e,S(I,g),"throw"===g.method)||"return"!==C&&(g.method="throw",g.arg=new TypeError("The iterator does not provide a '"+C+"' method")),G;var t=a(A,I.iterator,g.arg);if("throw"===t.type)return g.method="throw",g.arg=t.arg,g.delegate=null,G;var r=t.arg;return r?r.done?(g[I.resultName]=r.value,g.next=I.nextLoc,"return"!==g.method&&(g.method="next",g.arg=e),g.delegate=null,G):r:(g.method="throw",g.arg=new TypeError("iterator result is not an object"),g.delegate=null,G)}function w(I){var g={tryLoc:I[0]};1 in I&&(g.catchLoc=I[1]),2 in I&&(g.finallyLoc=I[2],g.afterLoc=I[3]),this.tryEntries.push(g)}function k(I){var g=I.completion||{};g.type="normal",delete g.arg,I.completion=g}function f(I){this.tryEntries=[{tryLoc:"root"}],I.forEach(w,this),this.reset(!0)}function F(I){if(I||""===I){var C=I[n];if(C)return C.call(I);if("function"==typeof I.next)return I;if(!isNaN(I.length)){var A=-1,t=function g(){for(;++A=0;--A){var t=this.tryEntries[A],c=t.completion;if("root"===t.tryLoc)return C("end");if(t.tryLoc<=this.prev){var i=r.call(t,"catchLoc"),n=r.call(t,"finallyLoc");if(i&&n){if(this.prev=0;--C){var e=this.tryEntries[C];if(e.tryLoc<=this.prev&&r.call(e,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),k(C),G}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var e=C.completion;if("throw"===e.type){var A=e.arg;k(C)}return A}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:F(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=e),G}},A}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(H);var w=(0,H.exports)();try{regeneratorRuntime=w}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=w:Function("r","regeneratorRuntime = r")(w)}function k(I){return k="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},k(I)}function f(I){var g=function(I,g){if("object"!==k(I)||null===I)return I;var C=I[Symbol.toPrimitive];if(void 0!==C){var e=C.call(I,g||"default");if("object"!==k(e))return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===g?String:Number)(I)}(I,"string");return"symbol"===k(g)?g:String(g)}function F(I,g){for(var C=0;C>>0:I}function Y(I,g){for(var C=g;0!==I[C];)C++;return new TextDecoder("utf-8").decode(I.subarray(g,C))}function K(I,g,C){var e=void 0===g?null:g,A=function(I,g){var C=atob(I);if(g){for(var e=new Uint8Array(C.length),A=0,t=C.length;A=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function P(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function q(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C4&&void 0!==arguments[4]?arguments[4]:0,t=I.name,r=this;function i(){return i=c(a.mark((function c(){var i,n,l,o,s,d,b,Z=arguments;return a.wrap((function(c){for(;;)switch(c.prev=c.next){case 0:for(i=Z.length,n=new Array(i),l=0;l=0?n[C]:C,d=e?n[e]:void 0,(b=new CI(t,I,n)).inputsAddr=o,b.output=s,b.subName=r.getName(d),"pvXpuDeviceMemFree"===t||"pvXpuGraphifiedFree"===t?r.addFreeNode(b,o[0]):r.addNode(b,o);case 14:case"end":return c.stop()}}),c)}))),i.apply(this,arguments)}return function(){return i.apply(this,arguments)}}},{key:"addNode",value:function(I,g){this._stack.push(I),this._paths.has(I)||this._paths.set(I,new Set);var C,e=j(g);try{for(e.s();!(C=e.n()).done;)for(var A=C.value,t=this._stack.length-2;t>=0;t--){var r=this._stack[t];if(r.output===A){this._paths.get(r).add(I),I.inputs.add(r);break}}}catch(I){e.e(I)}finally{e.f()}}},{key:"addFreeNode",value:function(I,g){this._stack.push(I),this._paths.has(I)||this._paths.set(I,new Set);for(var C=this._stack.length-2;C>=0;C--){var e=this._stack[C];if(e.inputsAddr.includes(g)){this._paths.get(e).add(I),I.inputs.add(e);break}}}},{key:"executeHelper",value:function(I){var g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(I.numVisited++,I.level=Math.max(g,I.level),!(I.numVisited0;)C.push(g.splice(0,8));e=0,A=C;case 5:if(!(ewait: ').concat(r.timeWait.toFixed(4),", execute: ").concat(r.timeExecute.toFixed(4),'>, style=filled, fillcolor="').concat(II(r.level),'"]\n');var i,n=j(c);try{for(n.s();!(i=n.n()).done;){var l=i.value;e+=" ".concat(r.id," -> ").concat(l.id,"\n")}}catch(I){n.e(I)}finally{n.f()}}}catch(I){A.e(I)}finally{A.f()}var o="digraph {\n".concat(g,"\n").concat(e,"}");console.log(o)}},{key:"clear",value:function(){this._paths.clear(),this._stack=[],CI.reset()}}]),I}(),CI=function(){function I(g,C,e){L(this,I),t(this,"id",void 0),t(this,"name",void 0),t(this,"subName",void 0),t(this,"visited",void 0),t(this,"numVisited",void 0),t(this,"executionPromise",void 0),t(this,"inputs",void 0),t(this,"inputsAddr",void 0),t(this,"output",void 0),t(this,"timeWait",0),t(this,"timeExecute",0),t(this,"level",0),t(this,"_fn",void 0),t(this,"_args",void 0),this.id=I.nodeId++,this.name=g,this.visited=!1,this.numVisited=0,this.inputs=new Set,this.inputsAddr=[],this.output=-1,this._fn=C,this._args=e}var g;return x(I,[{key:"runOnce",value:function(){var g=this;if(void 0===this.executionPromise){var C=O(this.inputs).map((function(I){return I.executionPromise}));this.executionPromise=Promise.all(C).then(c(a.mark((function C(){var e,A,t;return a.wrap((function(C){for(;;)switch(C.prev=C.next){case 0:return e=performance.now(),g.timeWait=(e-I.tick)/1e3,A=performance.now(),C.next=5,g._fn.apply(null,g._args);case 5:return t=C.sent,e=performance.now(),g.timeExecute=(e-A)/1e3,C.abrupt("return",t);case 9:case"end":return C.stop()}}),C)}))))}}},{key:"runFn",value:(g=c(a.mark((function I(){return a.wrap((function(I){for(;;)switch(I.prev=I.next){case 0:return I.next=2,this._fn.apply(null,this._args);case 2:case"end":return I.stop()}}),I,this)}))),function(){return g.apply(this,arguments)})}],[{key:"reset",value:function(){I.nodeId=0}}]),I}();function eI(I,g){var C=Object.keys(I);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(I);g&&(e=e.filter((function(g){return Object.getOwnPropertyDescriptor(I,g).enumerable}))),C.push.apply(C,e)}return C}function AI(I){for(var g=1;g=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function mI(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C>1,I|=I>>2,I|=I>>4,I|=I>>8,I|=I>>16,(I|=I>>32)-(I>>1)}function GI(I,g){var C=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;void 0===g&&(g=I,I=0);for(var e=[],A=I;C>0?Ag;A+=C)e.push(A);return e}!function(I){I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS=100]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS",I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_METAS=101]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_METAS",I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BIAS=102]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BIAS",I[I.WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE=103]="WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE",I[I.WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE=104]="WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE"}(nI||(nI={}));var BI=function(I,g,e){var A=function(g,C){new Int32Array(I.buffer)[g/Int32Array.BYTES_PER_ELEMENT]=C},t=function(){var e=c(a.mark((function e(t,r,c,i,n,l,o,s,d,b,Z){var m,u,G,B,y,V,W,h,R,X,p,H,J,S,w,k,f,F,K,N,E,U,M,Q,T,L,z,x,_,P,j;return a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=v(t),r=v(r),c=v(c),n=v(n),l=v(l),d=v(d),b=v(b),Z=v(Z),m=D.getXpu(t)){e.next=12;break}return A(Z,-1),e.abrupt("return");case 12:for(u=new Uint8Array(I.buffer),G=Y(u,r),g.addName(d,G),B=new Int32Array(I.buffer),y=B.slice(c/Int32Array.BYTES_PER_ELEMENT,c/Int32Array.BYTES_PER_ELEMENT+2),V=B.slice(n/Int32Array.BYTES_PER_ELEMENT,n/Int32Array.BYTES_PER_ELEMENT+i),W=B.slice(l/Int32Array.BYTES_PER_ELEMENT,l/Int32Array.BYTES_PER_ELEMENT+i),h=new Uint8Array(I.buffer).slice(d,d+s),R=[],X=0,p=0;p1024e4?GI(1,1+k):GI(1+k,1+k+f),F>0&&G.includes("att.v")&&(F>=f?S=GI(1+k+f,1+k+2*f):f===F+1&&(S=[0].concat(O(GI(1+k+f,k+2*f)))))),K=Math.ceil(s/o/S.length)*o,N=s/K,y[0]/=N,E=[],U=s,M=0;case 31:if(!(M=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function XI(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);Cu?A-u:0),y=t-Z,s.push(cI(l.workers[m],{action:Q.COPY_TO_XPU,memAddress:C,offset:G,buffer:d.slice(y,y+B)})),Z-=B),!(Z<=0)){g.next=33;break}return g.abrupt("break",36);case 33:m++,g.next=23;break;case 36:return g.next=38,Promise.all(s);case 38:case"end":return g.stop()}}),g)})));return function(I,C,e,A){return g.apply(this,arguments)}}(),s=function(){var g=c(a.mark((function g(C,e,A,t){var r,c,i,n,l,o,s,d,b,Z,m,u,G,B,y,V,W,h,R,X;return a.wrap((function(g){for(;;)switch(g.prev=g.next){case 0:if(C=v(C),e=v(e),r=D.getMemory(C)){g.next=5;break}return g.abrupt("return");case 5:if(c=r.objAddress,i=r.allocSize,n=r.memFlag,l=r.chunkSize,o=D.getXpu(c),Boolean(4&n)){g.next=13;break}(s=new Uint8Array(I.buffer)).set(s.slice(C+A,C+A+t),e),g.next=49;break;case 13:if(d=[],b=Boolean(2&n),Z=Boolean(8&n),!b&&!Z){g.next=20;break}d.push(cI(o.workers[0],{action:Q.COPY_FROM_XPU,memAddress:C,offset:A,size:i})),g.next=31;break;case 20:m=i,u=0;case 22:if(!(uG?A-G:0,y=Math.min(m,l-B),d.push(cI(o.workers[u],{action:Q.COPY_FROM_XPU,memAddress:C,offset:B,size:y})),m-=y),0!==m){g.next=28;break}return g.abrupt("break",31);case 28:u++,g.next=22;break;case 31:return g.next=33,Promise.all(d);case 33:V=g.sent,W=new Uint8Array(I.buffer),h=0,R=0;case 37:if(!(Rt)){g.next=44;break}return W.set(X.slice(0,t-h),e+h),g.abrupt("break",49);case 44:W.set(X,e+h),h+=X.length;case 46:R++,g.next=37;break;case 49:case"end":return g.stop()}}),g)})));return function(I,C,e,A){return g.apply(this,arguments)}}(),d=function(){var g=c(a.mark((function g(C,e,A){var t,r,c,i,n,l,o,s,d,b;return a.wrap((function(g){for(;;)switch(g.prev=g.next){case 0:if(C=v(C),t=D.getMemory(C)){g.next=4;break}return g.abrupt("return");case 4:if(r=t.objAddress,c=t.allocSize,i=t.memFlag,n=t.chunkSize,l=D.getXpu(r),Boolean(4&i)){g.next=12;break}new Uint8Array(I.buffer).fill(e,C,C+A),g.next=35;break;case 12:if(o=[],!Boolean(8&i)){g.next=18;break}o.push(cI(l.workers[0],{action:Q.MEMSET,memAddress:C,fillByte:e,size:c})),g.next=33;break;case 18:s=Boolean(2&i),d=A,b=0;case 21:if(!(b0&&m.set(u[G],G*s);for(b=[],B=0;B=0;--A){var t=this.tryEntries[A],c=t.completion;if("root"===t.tryLoc)return C("end");if(t.tryLoc<=this.prev){var i=r.call(t,"catchLoc"),n=r.call(t,"finallyLoc");if(i&&n){if(this.prev=0;--C){var e=this.tryEntries[C];if(e.tryLoc<=this.prev&&r.call(e,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),w(C),B}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var e=C.completion;if("throw"===e.type){var A=e.arg;w(C)}return A}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:F(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=e),B}},A}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(H);var J=(0,H.exports)();try{regeneratorRuntime=J}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=J:Function("r","regeneratorRuntime = r")(J)}function w(I){return w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},w(I)}function f(I){var g=function(I,g){if("object"!==w(I)||null===I)return I;var C=I[Symbol.toPrimitive];if(void 0!==C){var e=C.call(I,g||"default");if("object"!==w(e))return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===g?String:Number)(I)}(I,"string");return"symbol"===w(g)?g:String(g)}function F(I,g){for(var C=0;C>>0:I}function v(I,g){for(var C=g;0!==I[C];)C++;return new TextDecoder("utf-8").decode(I.subarray(g,C))}function K(I,g,C){var e=void 0===g?null:g,A=function(I,g){var C=atob(I);if(g){for(var e=new Uint8Array(C.length),A=0,t=C.length;A=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function P(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function q(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C4&&void 0!==arguments[4]?arguments[4]:0,t=I.name,r=this;function i(){return i=c(d.mark((function c(){var i,n,l,o,s,a,b,Z=arguments;return d.wrap((function(c){for(;;)switch(c.prev=c.next){case 0:for(i=Z.length,n=new Array(i),l=0;l=0?n[C]:C,a=e?n[e]:void 0,(b=new CI(t,I,n)).inputsAddr=o,b.output=s,b.subName=r.getName(a),"pvXpuDeviceMemFree"===t||"pvXpuGraphifiedFree"===t?r.addFreeNode(b,o[0]):r.addNode(b,o);case 14:case"end":return c.stop()}}),c)}))),i.apply(this,arguments)}return function(){return i.apply(this,arguments)}}},{key:"addNode",value:function(I,g){this._stack.push(I),this._paths.has(I)||this._paths.set(I,new Set);var C,e=D(g);try{for(e.s();!(C=e.n()).done;)for(var A=C.value,t=this._stack.length-2;t>=0;t--){var r=this._stack[t];if(r.output===A){this._paths.get(r).add(I),I.inputs.add(r);break}}}catch(I){e.e(I)}finally{e.f()}}},{key:"addFreeNode",value:function(I,g){this._stack.push(I),this._paths.has(I)||this._paths.set(I,new Set);for(var C=this._stack.length-2;C>=0;C--){var e=this._stack[C];if(e.inputsAddr.includes(g)){this._paths.get(e).add(I),I.inputs.add(e);break}}}},{key:"executeHelper",value:function(I){var g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(I.numVisited++,I.level=Math.max(g,I.level),!(I.numVisited0;)C.push(g.splice(0,8));e=0,A=C;case 5:if(!(ewait: ').concat(r.timeWait.toFixed(4),", execute: ").concat(r.timeExecute.toFixed(4),'>, style=filled, fillcolor="').concat(II(r.level),'"]\n');var i,n=D(c);try{for(n.s();!(i=n.n()).done;){var l=i.value;e+=" ".concat(r.id," -> ").concat(l.id,"\n")}}catch(I){n.e(I)}finally{n.f()}}}catch(I){A.e(I)}finally{A.f()}var o="digraph {\n".concat(g,"\n").concat(e,"}");console.log(o)}},{key:"clear",value:function(){this._paths.clear(),this._stack=[],CI.reset()}}]),I}(),CI=function(){function I(g,C,e){Q(this,I),t(this,"id",void 0),t(this,"name",void 0),t(this,"subName",void 0),t(this,"visited",void 0),t(this,"numVisited",void 0),t(this,"executionPromise",void 0),t(this,"inputs",void 0),t(this,"inputsAddr",void 0),t(this,"output",void 0),t(this,"timeWait",0),t(this,"timeExecute",0),t(this,"level",0),t(this,"_fn",void 0),t(this,"_args",void 0),this.id=I.nodeId++,this.name=g,this.visited=!1,this.numVisited=0,this.inputs=new Set,this.inputsAddr=[],this.output=-1,this._fn=C,this._args=e}var g;return x(I,[{key:"runOnce",value:function(){var g=this;if(void 0===this.executionPromise){var C=j(this.inputs).map((function(I){return I.executionPromise}));this.executionPromise=Promise.all(C).then(c(d.mark((function C(){var e,A,t;return d.wrap((function(C){for(;;)switch(C.prev=C.next){case 0:return e=performance.now(),g.timeWait=(e-I.tick)/1e3,A=performance.now(),C.next=5,g._fn.apply(null,g._args);case 5:return t=C.sent,e=performance.now(),g.timeExecute=(e-A)/1e3,C.abrupt("return",t);case 9:case"end":return C.stop()}}),C)}))))}}},{key:"runFn",value:(g=c(d.mark((function I(){return d.wrap((function(I){for(;;)switch(I.prev=I.next){case 0:return I.next=2,this._fn.apply(null,this._args);case 2:case"end":return I.stop()}}),I,this)}))),function(){return g.apply(this,arguments)})}],[{key:"reset",value:function(){I.nodeId=0}}]),I}();function eI(I,g){var C=Object.keys(I);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(I);g&&(e=e.filter((function(g){return Object.getOwnPropertyDescriptor(I,g).enumerable}))),C.push.apply(C,e)}return C}function AI(I){for(var g=1;g=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function mI(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C>1,I|=I>>2,I|=I>>4,I|=I>>8,I|=I>>16,(I|=I>>32)-(I>>1)}function BI(I,g){var C=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;void 0===g&&(g=I,I=0);for(var e=[],A=I;C>0?Ag;A+=C)e.push(A);return e}!function(I){I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS=100]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS",I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_METAS=101]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_METAS",I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BIAS=102]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BIAS",I[I.WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE=103]="WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE",I[I.WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE=104]="WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE"}(nI||(nI={}));var yI=function(I,g,e){var A=function(g,C){new Int32Array(I.buffer)[g/Int32Array.BYTES_PER_ELEMENT]=C},t=function(){var e=c(d.mark((function e(t,r,c,i,n,l,o,s,a,b,Z){var m,u,B,y,G,V,h,W,R,p,X,H,k,S,J,w,f,F,K,N,E,U,M,L,T,Q,z,x,_,P,D;return d.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Y(t),r=Y(r),c=Y(c),n=Y(n),l=Y(l),a=Y(a),b=Y(b),Z=Y(Z),m=O.getXpu(t)){e.next=12;break}return A(Z,-1),e.abrupt("return");case 12:for(u=new Uint8Array(I.buffer),B=v(u,r),g.addName(a,B),y=new Int32Array(I.buffer),G=y.slice(c/Int32Array.BYTES_PER_ELEMENT,c/Int32Array.BYTES_PER_ELEMENT+2),V=y.slice(n/Int32Array.BYTES_PER_ELEMENT,n/Int32Array.BYTES_PER_ELEMENT+i),h=y.slice(l/Int32Array.BYTES_PER_ELEMENT,l/Int32Array.BYTES_PER_ELEMENT+i),W=new Uint8Array(I.buffer).slice(a,a+s),R=[],p=0,X=0;X1024e4?BI(1,1+w):BI(1+w,1+w+f),F>0&&B.includes("att.v")&&(F>=f?S=BI(1+w+f,1+w+2*f):f===F+1&&(S=[0].concat(j(BI(1+w+f,w+2*f)))))),K=Math.ceil(s/o/S.length)*o,N=s/K,G[0]/=N,E=[],U=s,M=0;case 31:if(!(M=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function pI(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);Cu?A-u:0),G=t-Z,s.push(cI(l.workers[m],{action:L.COPY_TO_XPU,memAddress:C,offset:B,buffer:a.slice(G,G+y)})),Z-=y),!(Z<=0)){g.next=33;break}return g.abrupt("break",36);case 33:m++,g.next=23;break;case 36:return g.next=38,Promise.all(s);case 38:case"end":return g.stop()}}),g)})));return function(I,C,e,A){return g.apply(this,arguments)}}(),s=function(){var g=c(d.mark((function g(C,e,A,t){var r,c,i,n,l,o,s,a,b,Z,m,u,B,y,G,V,h,W,R,p;return d.wrap((function(g){for(;;)switch(g.prev=g.next){case 0:if(C=Y(C),e=Y(e),r=O.getMemory(C)){g.next=5;break}return g.abrupt("return");case 5:if(c=r.objAddress,i=r.allocSize,n=r.memFlag,l=r.chunkSize,o=O.getXpu(c),Boolean(4&n)){g.next=13;break}(s=new Uint8Array(I.buffer)).set(s.slice(C+A,C+A+t),e),g.next=49;break;case 13:if(a=[],b=Boolean(2&n),Z=Boolean(8&n),!b&&!Z){g.next=20;break}a.push(cI(o.workers[0],{action:L.COPY_FROM_XPU,memAddress:C,offset:A,size:i})),g.next=31;break;case 20:m=i,u=0;case 22:if(!(uB?A-B:0,G=Math.min(m,l-y),a.push(cI(o.workers[u],{action:L.COPY_FROM_XPU,memAddress:C,offset:y,size:G})),m-=G),0!==m){g.next=28;break}return g.abrupt("break",31);case 28:u++,g.next=22;break;case 31:return g.next=33,Promise.all(a);case 33:V=g.sent,h=new Uint8Array(I.buffer),W=0,R=0;case 37:if(!(Rt)){g.next=44;break}return h.set(p.slice(0,t-W),e+W),g.abrupt("break",49);case 44:h.set(p,e+W),W+=p.length;case 46:R++,g.next=37;break;case 49:case"end":return g.stop()}}),g)})));return function(I,C,e,A){return g.apply(this,arguments)}}(),a=function(){var g=c(d.mark((function g(C,e,A){var t,r,c,i,n,l,o,s,a,b;return d.wrap((function(g){for(;;)switch(g.prev=g.next){case 0:if(C=Y(C),t=O.getMemory(C)){g.next=4;break}return g.abrupt("return");case 4:if(r=t.objAddress,c=t.allocSize,i=t.memFlag,n=t.chunkSize,l=O.getXpu(r),Boolean(4&i)){g.next=12;break}new Uint8Array(I.buffer).fill(e,C,C+A),g.next=35;break;case 12:if(o=[],!Boolean(8&i)){g.next=18;break}o.push(cI(l.workers[0],{action:L.MEMSET,memAddress:C,fillByte:e,size:c})),g.next=33;break;case 18:s=Boolean(2&i),a=A,b=0;case 21:if(!(b0&&m.set(u[B],B*s);for(b=[],y=0;yI.length)&&(g=I.length);for(var C=0,e=new Array(g);C=0;--A){var t=this.tryEntries[A],c=t.completion;if("root"===t.tryLoc)return C("end");if(t.tryLoc<=this.prev){var i=r.call(t,"catchLoc"),n=r.call(t,"finallyLoc");if(i&&n){if(this.prev=0;--C){var e=this.tryEntries[C];if(e.tryLoc<=this.prev&&r.call(e,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),k(C),G}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var e=C.completion;if("throw"===e.type){var A=e.arg;k(C)}return A}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:F(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=e),G}},A}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(n);var s=(0,n.exports)(),d=s;try{regeneratorRuntime=s}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=s:Function("r","regeneratorRuntime = r")(s)}var b=i(d);const a={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},Z={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},m={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},u={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},G={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class B{static getFirstMatch(I,g){const C=g.match(I);return C&&C.length>0&&C[1]||""}static getSecondMatch(I,g){const C=g.match(I);return C&&C.length>1&&C[2]||""}static matchAndReturnConst(I,g,C){if(I.test(g))return C}static getWindowsVersionName(I){switch(I){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}static getMacOSVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),10===g[0])switch(g[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}static getAndroidVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),!(1===g[0]&&g[1]<5))return 1===g[0]&&g[1]<6?"Cupcake":1===g[0]&&g[1]>=6?"Donut":2===g[0]&&g[1]<2?"Eclair":2===g[0]&&2===g[1]?"Froyo":2===g[0]&&g[1]>2?"Gingerbread":3===g[0]?"Honeycomb":4===g[0]&&g[1]<1?"Ice Cream Sandwich":4===g[0]&&g[1]<4?"Jelly Bean":4===g[0]&&g[1]>=4?"KitKat":5===g[0]?"Lollipop":6===g[0]?"Marshmallow":7===g[0]?"Nougat":8===g[0]?"Oreo":9===g[0]?"Pie":void 0}static getVersionPrecision(I){return I.split(".").length}static compareVersions(I,g,C=!1){const e=B.getVersionPrecision(I),A=B.getVersionPrecision(g);let t=Math.max(e,A),r=0;const c=B.map([I,g],(I=>{const g=t-B.getVersionPrecision(I),C=I+new Array(g+1).join(".0");return B.map(C.split("."),(I=>new Array(20-I.length).join("0")+I)).reverse()}));for(C&&(r=t-Math.min(e,A)),t-=1;t>=r;){if(c[0][t]>c[1][t])return 1;if(c[0][t]===c[1][t]){if(t===r)return 0;t-=1}else if(c[0][t]{C[g]=I[g]}))}}return I}static getBrowserAlias(I){return a[I]}static getBrowserTypeByAlias(I){return Z[I]||""}}const y=/version\/(\d+(\.?_?\d+)+)/i,V=[{test:[/googlebot/i],describe(I){const g={name:"Googlebot"},C=B.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/opera/i],describe(I){const g={name:"Opera"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opr\/|opios/i],describe(I){const g={name:"Opera"},C=B.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/SamsungBrowser/i],describe(I){const g={name:"Samsung Internet for Android"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Whale/i],describe(I){const g={name:"NAVER Whale Browser"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MZBrowser/i],describe(I){const g={name:"MZ Browser"},C=B.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/focus/i],describe(I){const g={name:"Focus"},C=B.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/swing/i],describe(I){const g={name:"Swing"},C=B.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/coast/i],describe(I){const g={name:"Opera Coast"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(I){const g={name:"Opera Touch"},C=B.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/yabrowser/i],describe(I){const g={name:"Yandex Browser"},C=B.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/ucbrowser/i],describe(I){const g={name:"UC Browser"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Maxthon|mxios/i],describe(I){const g={name:"Maxthon"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/epiphany/i],describe(I){const g={name:"Epiphany"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/puffin/i],describe(I){const g={name:"Puffin"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sleipnir/i],describe(I){const g={name:"Sleipnir"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/k-meleon/i],describe(I){const g={name:"K-Meleon"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/micromessenger/i],describe(I){const g={name:"WeChat"},C=B.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/qqbrowser/i],describe(I){const g={name:/qqbrowserlite/i.test(I)?"QQ Browser Lite":"QQ Browser"},C=B.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/msie|trident/i],describe(I){const g={name:"Internet Explorer"},C=B.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/\sedg\//i],describe(I){const g={name:"Microsoft Edge"},C=B.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/edg([ea]|ios)/i],describe(I){const g={name:"Microsoft Edge"},C=B.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/vivaldi/i],describe(I){const g={name:"Vivaldi"},C=B.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/seamonkey/i],describe(I){const g={name:"SeaMonkey"},C=B.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sailfish/i],describe(I){const g={name:"Sailfish"},C=B.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,I);return C&&(g.version=C),g}},{test:[/silk/i],describe(I){const g={name:"Amazon Silk"},C=B.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/phantom/i],describe(I){const g={name:"PhantomJS"},C=B.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/slimerjs/i],describe(I){const g={name:"SlimerJS"},C=B.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g={name:"BlackBerry"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(web|hpw)[o0]s/i],describe(I){const g={name:"WebOS Browser"},C=B.getFirstMatch(y,I)||B.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/bada/i],describe(I){const g={name:"Bada"},C=B.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/tizen/i],describe(I){const g={name:"Tizen"},C=B.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/qupzilla/i],describe(I){const g={name:"QupZilla"},C=B.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/firefox|iceweasel|fxios/i],describe(I){const g={name:"Firefox"},C=B.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/electron/i],describe(I){const g={name:"Electron"},C=B.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MiuiBrowser/i],describe(I){const g={name:"Miui"},C=B.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/chromium/i],describe(I){const g={name:"Chromium"},C=B.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,I)||B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/chrome|crios|crmo/i],describe(I){const g={name:"Chrome"},C=B.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/GSA/i],describe(I){const g={name:"Google Search"},C=B.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g={name:"Android Browser"},C=B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/playstation 4/i],describe(I){const g={name:"PlayStation 4"},C=B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/safari|applewebkit/i],describe(I){const g={name:"Safari"},C=B.getFirstMatch(y,I);return C&&(g.version=C),g}},{test:[/.*/i],describe(I){const g=-1!==I.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:B.getFirstMatch(g,I),version:B.getSecondMatch(g,I)}}}];var W=[{test:[/Roku\/DVP/],describe(I){const g=B.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,I);return{name:u.Roku,version:g}}},{test:[/windows phone/i],describe(I){const g=B.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,I);return{name:u.WindowsPhone,version:g}}},{test:[/windows /i],describe(I){const g=B.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,I),C=B.getWindowsVersionName(g);return{name:u.Windows,version:g,versionName:C}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(I){const g={name:u.iOS},C=B.getSecondMatch(/(Version\/)(\d[\d.]+)/,I);return C&&(g.version=C),g}},{test:[/macintosh/i],describe(I){const g=B.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,I).replace(/[_\s]/g,"."),C=B.getMacOSVersionName(g),e={name:u.MacOS,version:g};return C&&(e.versionName=C),e}},{test:[/(ipod|iphone|ipad)/i],describe(I){const g=B.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,I).replace(/[_\s]/g,".");return{name:u.iOS,version:g}}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g=B.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,I),C=B.getAndroidVersionName(g),e={name:u.Android,version:g};return C&&(e.versionName=C),e}},{test:[/(web|hpw)[o0]s/i],describe(I){const g=B.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,I),C={name:u.WebOS};return g&&g.length&&(C.version=g),C}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g=B.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,I)||B.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,I)||B.getFirstMatch(/\bbb(\d+)/i,I);return{name:u.BlackBerry,version:g}}},{test:[/bada/i],describe(I){const g=B.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,I);return{name:u.Bada,version:g}}},{test:[/tizen/i],describe(I){const g=B.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,I);return{name:u.Tizen,version:g}}},{test:[/linux/i],describe:()=>({name:u.Linux})},{test:[/CrOS/],describe:()=>({name:u.ChromeOS})},{test:[/PlayStation 4/],describe(I){const g=B.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,I);return{name:u.PlayStation4,version:g}}}],h=[{test:[/googlebot/i],describe:()=>({type:"bot",vendor:"Google"})},{test:[/huawei/i],describe(I){const g=B.getFirstMatch(/(can-l01)/i,I)&&"Nova",C={type:m.mobile,vendor:"Huawei"};return g&&(C.model=g),C}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:()=>({type:m.tablet,vendor:"Nexus"})},{test:[/ipad/i],describe:()=>({type:m.tablet,vendor:"Apple",model:"iPad"})},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:()=>({type:m.tablet,vendor:"Apple",model:"iPad"})},{test:[/kftt build/i],describe:()=>({type:m.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"})},{test:[/silk/i],describe:()=>({type:m.tablet,vendor:"Amazon"})},{test:[/tablet(?! pc)/i],describe:()=>({type:m.tablet})},{test(I){const g=I.test(/ipod|iphone/i),C=I.test(/like (ipod|iphone)/i);return g&&!C},describe(I){const g=B.getFirstMatch(/(ipod|iphone)/i,I);return{type:m.mobile,vendor:"Apple",model:g}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:()=>({type:m.mobile,vendor:"Nexus"})},{test:[/[^-]mobi/i],describe:()=>({type:m.mobile})},{test:I=>"blackberry"===I.getBrowserName(!0),describe:()=>({type:m.mobile,vendor:"BlackBerry"})},{test:I=>"bada"===I.getBrowserName(!0),describe:()=>({type:m.mobile})},{test:I=>"windows phone"===I.getBrowserName(),describe:()=>({type:m.mobile,vendor:"Microsoft"})},{test(I){const g=Number(String(I.getOSVersion()).split(".")[0]);return"android"===I.getOSName(!0)&&g>=3},describe:()=>({type:m.tablet})},{test:I=>"android"===I.getOSName(!0),describe:()=>({type:m.mobile})},{test:I=>"macos"===I.getOSName(!0),describe:()=>({type:m.desktop,vendor:"Apple"})},{test:I=>"windows"===I.getOSName(!0),describe:()=>({type:m.desktop})},{test:I=>"linux"===I.getOSName(!0),describe:()=>({type:m.desktop})},{test:I=>"playstation 4"===I.getOSName(!0),describe:()=>({type:m.tv})},{test:I=>"roku"===I.getOSName(!0),describe:()=>({type:m.tv})}],R=[{test:I=>"microsoft edge"===I.getBrowserName(!0),describe(I){if(/\sedg\//i.test(I))return{name:G.Blink};const g=B.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,I);return{name:G.EdgeHTML,version:g}}},{test:[/trident/i],describe(I){const g={name:G.Trident},C=B.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:I=>I.test(/presto/i),describe(I){const g={name:G.Presto},C=B.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=I.test(/gecko/i),C=I.test(/like gecko/i);return g&&!C},describe(I){const g={name:G.Gecko},C=B.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(apple)?webkit\/537\.36/i],describe:()=>({name:G.Blink})},{test:[/(apple)?webkit/i],describe(I){const g={name:G.WebKit},C=B.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}}];class X{constructor(I,g=!1){if(null==I||""===I)throw new Error("UserAgent parameter can't be empty");this._ua=I,this.parsedResult={},!0!==g&&this.parse()}getUA(){return this._ua}test(I){return I.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const I=B.find(V,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.browser=I.describe(this.getUA())),this.parsedResult.browser}getBrowser(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}getBrowserName(I){return I?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}parseOS(){this.parsedResult.os={};const I=B.find(W,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.os=I.describe(this.getUA())),this.parsedResult.os}getOSName(I){const{name:g}=this.getOS();return I?String(g).toLowerCase()||"":g||""}getOSVersion(){return this.getOS().version}getPlatform(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}getPlatformType(I=!1){const{type:g}=this.getPlatform();return I?String(g).toLowerCase()||"":g||""}parsePlatform(){this.parsedResult.platform={};const I=B.find(h,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.platform=I.describe(this.getUA())),this.parsedResult.platform}getEngine(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}getEngineName(I){return I?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const I=B.find(R,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.engine=I.describe(this.getUA())),this.parsedResult.engine}parse(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}getResult(){return B.assign({},this.parsedResult)}satisfies(I){const g={};let C=0;const e={};let A=0;if(Object.keys(I).forEach((t=>{const r=I[t];"string"==typeof r?(e[t]=r,A+=1):"object"==typeof r&&(g[t]=r,C+=1)})),C>0){const I=Object.keys(g),C=B.find(I,(I=>this.isOS(I)));if(C){const I=this.satisfies(g[C]);if(void 0!==I)return I}const e=B.find(I,(I=>this.isPlatform(I)));if(e){const I=this.satisfies(g[e]);if(void 0!==I)return I}}if(A>0){const I=Object.keys(e),g=B.find(I,(I=>this.isBrowser(I,!0)));if(void 0!==g)return this.compareVersion(e[g])}}isBrowser(I,g=!1){const C=this.getBrowserName().toLowerCase();let e=I.toLowerCase();const A=B.getBrowserTypeByAlias(e);return g&&A&&(e=A.toLowerCase()),e===C}compareVersion(I){let g=[0],C=I,e=!1;const A=this.getBrowserVersion();if("string"==typeof A)return">"===I[0]||"<"===I[0]?(C=I.substr(1),"="===I[1]?(e=!0,C=I.substr(2)):g=[],">"===I[0]?g.push(1):g.push(-1)):"="===I[0]?C=I.substr(1):"~"===I[0]&&(e=!0,C=I.substr(1)),g.indexOf(B.compareVersions(A,C,e))>-1}isOS(I){return this.getOSName(!0)===String(I).toLowerCase()}isPlatform(I){return this.getPlatformType(!0)===String(I).toLowerCase()}isEngine(I){return this.getEngineName(!0)===String(I).toLowerCase()}is(I,g=!1){return this.isBrowser(I,g)||this.isOS(I)||this.isPlatform(I)}some(I=[]){return I.some((I=>this.is(I)))}} +var XpuWebWorker=function(){"use strict";function I(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C=0;--A){var t=this.tryEntries[A],c=t.completion;if("root"===t.tryLoc)return C("end");if(t.tryLoc<=this.prev){var i=r.call(t,"catchLoc"),n=r.call(t,"finallyLoc");if(i&&n){if(this.prev=0;--C){var e=this.tryEntries[C];if(e.tryLoc<=this.prev&&r.call(e,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),w(C),B}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var e=C.completion;if("throw"===e.type){var A=e.arg;w(C)}return A}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:F(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=e),B}},A}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(n);var s=(0,n.exports)(),a=s;try{regeneratorRuntime=s}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=s:Function("r","regeneratorRuntime = r")(s)}var d=i(a);const b={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},Z={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},m={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},u={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},B={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class y{static getFirstMatch(I,g){const C=g.match(I);return C&&C.length>0&&C[1]||""}static getSecondMatch(I,g){const C=g.match(I);return C&&C.length>1&&C[2]||""}static matchAndReturnConst(I,g,C){if(I.test(g))return C}static getWindowsVersionName(I){switch(I){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}static getMacOSVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),10===g[0])switch(g[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}static getAndroidVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),!(1===g[0]&&g[1]<5))return 1===g[0]&&g[1]<6?"Cupcake":1===g[0]&&g[1]>=6?"Donut":2===g[0]&&g[1]<2?"Eclair":2===g[0]&&2===g[1]?"Froyo":2===g[0]&&g[1]>2?"Gingerbread":3===g[0]?"Honeycomb":4===g[0]&&g[1]<1?"Ice Cream Sandwich":4===g[0]&&g[1]<4?"Jelly Bean":4===g[0]&&g[1]>=4?"KitKat":5===g[0]?"Lollipop":6===g[0]?"Marshmallow":7===g[0]?"Nougat":8===g[0]?"Oreo":9===g[0]?"Pie":void 0}static getVersionPrecision(I){return I.split(".").length}static compareVersions(I,g,C=!1){const e=y.getVersionPrecision(I),A=y.getVersionPrecision(g);let t=Math.max(e,A),r=0;const c=y.map([I,g],(I=>{const g=t-y.getVersionPrecision(I),C=I+new Array(g+1).join(".0");return y.map(C.split("."),(I=>new Array(20-I.length).join("0")+I)).reverse()}));for(C&&(r=t-Math.min(e,A)),t-=1;t>=r;){if(c[0][t]>c[1][t])return 1;if(c[0][t]===c[1][t]){if(t===r)return 0;t-=1}else if(c[0][t]{C[g]=I[g]}))}}return I}static getBrowserAlias(I){return b[I]}static getBrowserTypeByAlias(I){return Z[I]||""}}const G=/version\/(\d+(\.?_?\d+)+)/i,V=[{test:[/googlebot/i],describe(I){const g={name:"Googlebot"},C=y.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/opera/i],describe(I){const g={name:"Opera"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opr\/|opios/i],describe(I){const g={name:"Opera"},C=y.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/SamsungBrowser/i],describe(I){const g={name:"Samsung Internet for Android"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Whale/i],describe(I){const g={name:"NAVER Whale Browser"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MZBrowser/i],describe(I){const g={name:"MZ Browser"},C=y.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/focus/i],describe(I){const g={name:"Focus"},C=y.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/swing/i],describe(I){const g={name:"Swing"},C=y.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/coast/i],describe(I){const g={name:"Opera Coast"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(I){const g={name:"Opera Touch"},C=y.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/yabrowser/i],describe(I){const g={name:"Yandex Browser"},C=y.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/ucbrowser/i],describe(I){const g={name:"UC Browser"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Maxthon|mxios/i],describe(I){const g={name:"Maxthon"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/epiphany/i],describe(I){const g={name:"Epiphany"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/puffin/i],describe(I){const g={name:"Puffin"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sleipnir/i],describe(I){const g={name:"Sleipnir"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/k-meleon/i],describe(I){const g={name:"K-Meleon"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/micromessenger/i],describe(I){const g={name:"WeChat"},C=y.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/qqbrowser/i],describe(I){const g={name:/qqbrowserlite/i.test(I)?"QQ Browser Lite":"QQ Browser"},C=y.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/msie|trident/i],describe(I){const g={name:"Internet Explorer"},C=y.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/\sedg\//i],describe(I){const g={name:"Microsoft Edge"},C=y.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/edg([ea]|ios)/i],describe(I){const g={name:"Microsoft Edge"},C=y.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/vivaldi/i],describe(I){const g={name:"Vivaldi"},C=y.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/seamonkey/i],describe(I){const g={name:"SeaMonkey"},C=y.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sailfish/i],describe(I){const g={name:"Sailfish"},C=y.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,I);return C&&(g.version=C),g}},{test:[/silk/i],describe(I){const g={name:"Amazon Silk"},C=y.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/phantom/i],describe(I){const g={name:"PhantomJS"},C=y.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/slimerjs/i],describe(I){const g={name:"SlimerJS"},C=y.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g={name:"BlackBerry"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(web|hpw)[o0]s/i],describe(I){const g={name:"WebOS Browser"},C=y.getFirstMatch(G,I)||y.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/bada/i],describe(I){const g={name:"Bada"},C=y.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/tizen/i],describe(I){const g={name:"Tizen"},C=y.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/qupzilla/i],describe(I){const g={name:"QupZilla"},C=y.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/firefox|iceweasel|fxios/i],describe(I){const g={name:"Firefox"},C=y.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/electron/i],describe(I){const g={name:"Electron"},C=y.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MiuiBrowser/i],describe(I){const g={name:"Miui"},C=y.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/chromium/i],describe(I){const g={name:"Chromium"},C=y.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,I)||y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/chrome|crios|crmo/i],describe(I){const g={name:"Chrome"},C=y.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/GSA/i],describe(I){const g={name:"Google Search"},C=y.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g={name:"Android Browser"},C=y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/playstation 4/i],describe(I){const g={name:"PlayStation 4"},C=y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/safari|applewebkit/i],describe(I){const g={name:"Safari"},C=y.getFirstMatch(G,I);return C&&(g.version=C),g}},{test:[/.*/i],describe(I){const g=-1!==I.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:y.getFirstMatch(g,I),version:y.getSecondMatch(g,I)}}}];var h=[{test:[/Roku\/DVP/],describe(I){const g=y.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,I);return{name:u.Roku,version:g}}},{test:[/windows phone/i],describe(I){const g=y.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,I);return{name:u.WindowsPhone,version:g}}},{test:[/windows /i],describe(I){const g=y.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,I),C=y.getWindowsVersionName(g);return{name:u.Windows,version:g,versionName:C}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(I){const g={name:u.iOS},C=y.getSecondMatch(/(Version\/)(\d[\d.]+)/,I);return C&&(g.version=C),g}},{test:[/macintosh/i],describe(I){const g=y.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,I).replace(/[_\s]/g,"."),C=y.getMacOSVersionName(g),e={name:u.MacOS,version:g};return C&&(e.versionName=C),e}},{test:[/(ipod|iphone|ipad)/i],describe(I){const g=y.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,I).replace(/[_\s]/g,".");return{name:u.iOS,version:g}}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g=y.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,I),C=y.getAndroidVersionName(g),e={name:u.Android,version:g};return C&&(e.versionName=C),e}},{test:[/(web|hpw)[o0]s/i],describe(I){const g=y.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,I),C={name:u.WebOS};return g&&g.length&&(C.version=g),C}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g=y.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,I)||y.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,I)||y.getFirstMatch(/\bbb(\d+)/i,I);return{name:u.BlackBerry,version:g}}},{test:[/bada/i],describe(I){const g=y.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,I);return{name:u.Bada,version:g}}},{test:[/tizen/i],describe(I){const g=y.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,I);return{name:u.Tizen,version:g}}},{test:[/linux/i],describe:()=>({name:u.Linux})},{test:[/CrOS/],describe:()=>({name:u.ChromeOS})},{test:[/PlayStation 4/],describe(I){const g=y.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,I);return{name:u.PlayStation4,version:g}}}],W=[{test:[/googlebot/i],describe:()=>({type:"bot",vendor:"Google"})},{test:[/huawei/i],describe(I){const g=y.getFirstMatch(/(can-l01)/i,I)&&"Nova",C={type:m.mobile,vendor:"Huawei"};return g&&(C.model=g),C}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:()=>({type:m.tablet,vendor:"Nexus"})},{test:[/ipad/i],describe:()=>({type:m.tablet,vendor:"Apple",model:"iPad"})},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:()=>({type:m.tablet,vendor:"Apple",model:"iPad"})},{test:[/kftt build/i],describe:()=>({type:m.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"})},{test:[/silk/i],describe:()=>({type:m.tablet,vendor:"Amazon"})},{test:[/tablet(?! pc)/i],describe:()=>({type:m.tablet})},{test(I){const g=I.test(/ipod|iphone/i),C=I.test(/like (ipod|iphone)/i);return g&&!C},describe(I){const g=y.getFirstMatch(/(ipod|iphone)/i,I);return{type:m.mobile,vendor:"Apple",model:g}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:()=>({type:m.mobile,vendor:"Nexus"})},{test:[/[^-]mobi/i],describe:()=>({type:m.mobile})},{test:I=>"blackberry"===I.getBrowserName(!0),describe:()=>({type:m.mobile,vendor:"BlackBerry"})},{test:I=>"bada"===I.getBrowserName(!0),describe:()=>({type:m.mobile})},{test:I=>"windows phone"===I.getBrowserName(),describe:()=>({type:m.mobile,vendor:"Microsoft"})},{test(I){const g=Number(String(I.getOSVersion()).split(".")[0]);return"android"===I.getOSName(!0)&&g>=3},describe:()=>({type:m.tablet})},{test:I=>"android"===I.getOSName(!0),describe:()=>({type:m.mobile})},{test:I=>"macos"===I.getOSName(!0),describe:()=>({type:m.desktop,vendor:"Apple"})},{test:I=>"windows"===I.getOSName(!0),describe:()=>({type:m.desktop})},{test:I=>"linux"===I.getOSName(!0),describe:()=>({type:m.desktop})},{test:I=>"playstation 4"===I.getOSName(!0),describe:()=>({type:m.tv})},{test:I=>"roku"===I.getOSName(!0),describe:()=>({type:m.tv})}],R=[{test:I=>"microsoft edge"===I.getBrowserName(!0),describe(I){if(/\sedg\//i.test(I))return{name:B.Blink};const g=y.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,I);return{name:B.EdgeHTML,version:g}}},{test:[/trident/i],describe(I){const g={name:B.Trident},C=y.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:I=>I.test(/presto/i),describe(I){const g={name:B.Presto},C=y.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=I.test(/gecko/i),C=I.test(/like gecko/i);return g&&!C},describe(I){const g={name:B.Gecko},C=y.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(apple)?webkit\/537\.36/i],describe:()=>({name:B.Blink})},{test:[/(apple)?webkit/i],describe(I){const g={name:B.WebKit},C=y.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}}];class p{constructor(I,g=!1){if(null==I||""===I)throw new Error("UserAgent parameter can't be empty");this._ua=I,this.parsedResult={},!0!==g&&this.parse()}getUA(){return this._ua}test(I){return I.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const I=y.find(V,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.browser=I.describe(this.getUA())),this.parsedResult.browser}getBrowser(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}getBrowserName(I){return I?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}parseOS(){this.parsedResult.os={};const I=y.find(h,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.os=I.describe(this.getUA())),this.parsedResult.os}getOSName(I){const{name:g}=this.getOS();return I?String(g).toLowerCase()||"":g||""}getOSVersion(){return this.getOS().version}getPlatform(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}getPlatformType(I=!1){const{type:g}=this.getPlatform();return I?String(g).toLowerCase()||"":g||""}parsePlatform(){this.parsedResult.platform={};const I=y.find(W,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.platform=I.describe(this.getUA())),this.parsedResult.platform}getEngine(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}getEngineName(I){return I?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const I=y.find(R,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.engine=I.describe(this.getUA())),this.parsedResult.engine}parse(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}getResult(){return y.assign({},this.parsedResult)}satisfies(I){const g={};let C=0;const e={};let A=0;if(Object.keys(I).forEach((t=>{const r=I[t];"string"==typeof r?(e[t]=r,A+=1):"object"==typeof r&&(g[t]=r,C+=1)})),C>0){const I=Object.keys(g),C=y.find(I,(I=>this.isOS(I)));if(C){const I=this.satisfies(g[C]);if(void 0!==I)return I}const e=y.find(I,(I=>this.isPlatform(I)));if(e){const I=this.satisfies(g[e]);if(void 0!==I)return I}}if(A>0){const I=Object.keys(e),g=y.find(I,(I=>this.isBrowser(I,!0)));if(void 0!==g)return this.compareVersion(e[g])}}isBrowser(I,g=!1){const C=this.getBrowserName().toLowerCase();let e=I.toLowerCase();const A=y.getBrowserTypeByAlias(e);return g&&A&&(e=A.toLowerCase()),e===C}compareVersion(I){let g=[0],C=I,e=!1;const A=this.getBrowserVersion();if("string"==typeof A)return">"===I[0]||"<"===I[0]?(C=I.substr(1),"="===I[1]?(e=!0,C=I.substr(2)):g=[],">"===I[0]?g.push(1):g.push(-1)):"="===I[0]?C=I.substr(1):"~"===I[0]&&(e=!0,C=I.substr(1)),g.indexOf(y.compareVersions(A,C,e))>-1}isOS(I){return this.getOSName(!0)===String(I).toLowerCase()}isPlatform(I){return this.getPlatformType(!0)===String(I).toLowerCase()}isEngine(I){return this.getEngineName(!0)===String(I).toLowerCase()}is(I,g=!1){return this.isBrowser(I,g)||this.isOS(I)||this.isPlatform(I)}some(I=[]){return I.some((I=>this.is(I)))}} /*! * Bowser - a browser detector * https://github.com/lancedikson/bowser * MIT License | (c) Dustin Diaz 2012-2015 * MIT License | (c) Denis Demchenko 2015-2019 - */class p{static getParser(I,g=!1){if("string"!=typeof I)throw new Error("UserAgent should be a string");return new X(I,g)}static parse(I){return new X(I).getResult()}static get BROWSER_MAP(){return Z}static get ENGINE_MAP(){return G}static get OS_MAP(){return u}static get PLATFORMS_MAP(){return m}}var H={exports:{}},J={exports:{}};!function(I){function g(C){return I.exports=g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},I.exports.__esModule=!0,I.exports.default=I.exports,g(C)}I.exports=g,I.exports.__esModule=!0,I.exports.default=I.exports}(J);var S=J.exports;!function(I){var g=S.default;function C(){I.exports=C=function(){return A},I.exports.__esModule=!0,I.exports.default=I.exports;var e,A={},t=Object.prototype,r=t.hasOwnProperty,c=Object.defineProperty||function(I,g,C){I[g]=C.value},i="function"==typeof Symbol?Symbol:{},n=i.iterator||"@@iterator",l=i.asyncIterator||"@@asyncIterator",o=i.toStringTag||"@@toStringTag";function s(I,g,C){return Object.defineProperty(I,g,{value:C,enumerable:!0,configurable:!0,writable:!0}),I[g]}try{s({},"")}catch(e){s=function(I,g,C){return I[g]=C}}function d(I,g,C,e){var A=g&&g.prototype instanceof B?g:B,t=Object.create(A.prototype),r=new f(e||[]);return c(t,"_invoke",{value:J(I,C,r)}),t}function b(I,g,C){try{return{type:"normal",arg:I.call(g,C)}}catch(I){return{type:"throw",arg:I}}}A.wrap=d;var a="suspendedStart",Z="suspendedYield",m="executing",u="completed",G={};function B(){}function y(){}function V(){}var W={};s(W,n,(function(){return this}));var h=Object.getPrototypeOf,R=h&&h(h(F([])));R&&R!==t&&r.call(R,n)&&(W=R);var X=V.prototype=B.prototype=Object.create(W);function p(I){["next","throw","return"].forEach((function(g){s(I,g,(function(I){return this._invoke(g,I)}))}))}function H(I,C){function e(A,t,c,i){var n=b(I[A],I,t);if("throw"!==n.type){var l=n.arg,o=l.value;return o&&"object"==g(o)&&r.call(o,"__await")?C.resolve(o.__await).then((function(I){e("next",I,c,i)}),(function(I){e("throw",I,c,i)})):C.resolve(o).then((function(I){l.value=I,c(l)}),(function(I){return e("throw",I,c,i)}))}i(n.arg)}var A;c(this,"_invoke",{value:function(I,g){function t(){return new C((function(C,A){e(I,g,C,A)}))}return A=A?A.then(t,t):t()}})}function J(I,g,C){var A=a;return function(t,r){if(A===m)throw new Error("Generator is already running");if(A===u){if("throw"===t)throw r;return{value:e,done:!0}}for(C.method=t,C.arg=r;;){var c=C.delegate;if(c){var i=S(c,C);if(i){if(i===G)continue;return i}}if("next"===C.method)C.sent=C._sent=C.arg;else if("throw"===C.method){if(A===a)throw A=u,C.arg;C.dispatchException(C.arg)}else"return"===C.method&&C.abrupt("return",C.arg);A=m;var n=b(I,g,C);if("normal"===n.type){if(A=C.done?u:Z,n.arg===G)continue;return{value:n.arg,done:C.done}}"throw"===n.type&&(A=u,C.method="throw",C.arg=n.arg)}}}function S(I,g){var C=g.method,A=I.iterator[C];if(A===e)return g.delegate=null,"throw"===C&&I.iterator.return&&(g.method="return",g.arg=e,S(I,g),"throw"===g.method)||"return"!==C&&(g.method="throw",g.arg=new TypeError("The iterator does not provide a '"+C+"' method")),G;var t=b(A,I.iterator,g.arg);if("throw"===t.type)return g.method="throw",g.arg=t.arg,g.delegate=null,G;var r=t.arg;return r?r.done?(g[I.resultName]=r.value,g.next=I.nextLoc,"return"!==g.method&&(g.method="next",g.arg=e),g.delegate=null,G):r:(g.method="throw",g.arg=new TypeError("iterator result is not an object"),g.delegate=null,G)}function w(I){var g={tryLoc:I[0]};1 in I&&(g.catchLoc=I[1]),2 in I&&(g.finallyLoc=I[2],g.afterLoc=I[3]),this.tryEntries.push(g)}function k(I){var g=I.completion||{};g.type="normal",delete g.arg,I.completion=g}function f(I){this.tryEntries=[{tryLoc:"root"}],I.forEach(w,this),this.reset(!0)}function F(I){if(I||""===I){var C=I[n];if(C)return C.call(I);if("function"==typeof I.next)return I;if(!isNaN(I.length)){var A=-1,t=function g(){for(;++A=0;--A){var t=this.tryEntries[A],c=t.completion;if("root"===t.tryLoc)return C("end");if(t.tryLoc<=this.prev){var i=r.call(t,"catchLoc"),n=r.call(t,"finallyLoc");if(i&&n){if(this.prev=0;--C){var e=this.tryEntries[C];if(e.tryLoc<=this.prev&&r.call(e,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),k(C),G}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var e=C.completion;if("throw"===e.type){var A=e.arg;k(C)}return A}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:F(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=e),G}},A}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(H);var w=(0,H.exports)();try{regeneratorRuntime=w}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=w:Function("r","regeneratorRuntime = r")(w)}function k(I){return k="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},k(I)}function f(I){var g=function(I,g){if("object"!==k(I)||null===I)return I;var C=I[Symbol.toPrimitive];if(void 0!==C){var e=C.call(I,g||"default");if("object"!==k(e))return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===g?String:Number)(I)}(I,"string");return"symbol"===k(g)?g:String(g)}function F(I,g){for(var C=0;C>>0:I}function Y(I,g){for(var C=g;0!==I[C];)C++;return new TextDecoder("utf-8").decode(I.subarray(g,C))}function K(I,g,C){var e=void 0===g?null:g,A=function(I,g){var C=atob(I);if(g){for(var e=new Uint8Array(C.length),A=0,t=C.length;A=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function P(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function q(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C4&&void 0!==arguments[4]?arguments[4]:0,t=I.name,r=this;function i(){return i=c(b.mark((function c(){var i,n,l,o,s,d,a,Z=arguments;return b.wrap((function(c){for(;;)switch(c.prev=c.next){case 0:for(i=Z.length,n=new Array(i),l=0;l=0?n[C]:C,d=e?n[e]:void 0,(a=new CI(t,I,n)).inputsAddr=o,a.output=s,a.subName=r.getName(d),"pvXpuDeviceMemFree"===t||"pvXpuGraphifiedFree"===t?r.addFreeNode(a,o[0]):r.addNode(a,o);case 14:case"end":return c.stop()}}),c)}))),i.apply(this,arguments)}return function(){return i.apply(this,arguments)}}},{key:"addNode",value:function(I,g){this._stack.push(I),this._paths.has(I)||this._paths.set(I,new Set);var C,e=j(g);try{for(e.s();!(C=e.n()).done;)for(var A=C.value,t=this._stack.length-2;t>=0;t--){var r=this._stack[t];if(r.output===A){this._paths.get(r).add(I),I.inputs.add(r);break}}}catch(I){e.e(I)}finally{e.f()}}},{key:"addFreeNode",value:function(I,g){this._stack.push(I),this._paths.has(I)||this._paths.set(I,new Set);for(var C=this._stack.length-2;C>=0;C--){var e=this._stack[C];if(e.inputsAddr.includes(g)){this._paths.get(e).add(I),I.inputs.add(e);break}}}},{key:"executeHelper",value:function(I){var g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(I.numVisited++,I.level=Math.max(g,I.level),!(I.numVisited0;)C.push(g.splice(0,8));e=0,A=C;case 5:if(!(ewait: ').concat(r.timeWait.toFixed(4),", execute: ").concat(r.timeExecute.toFixed(4),'>, style=filled, fillcolor="').concat(II(r.level),'"]\n');var i,n=j(c);try{for(n.s();!(i=n.n()).done;){var l=i.value;e+=" ".concat(r.id," -> ").concat(l.id,"\n")}}catch(I){n.e(I)}finally{n.f()}}}catch(I){A.e(I)}finally{A.f()}var o="digraph {\n".concat(g,"\n").concat(e,"}");console.log(o)}},{key:"clear",value:function(){this._paths.clear(),this._stack=[],CI.reset()}}]),I}(),CI=function(){function I(g,C,e){L(this,I),t(this,"id",void 0),t(this,"name",void 0),t(this,"subName",void 0),t(this,"visited",void 0),t(this,"numVisited",void 0),t(this,"executionPromise",void 0),t(this,"inputs",void 0),t(this,"inputsAddr",void 0),t(this,"output",void 0),t(this,"timeWait",0),t(this,"timeExecute",0),t(this,"level",0),t(this,"_fn",void 0),t(this,"_args",void 0),this.id=I.nodeId++,this.name=g,this.visited=!1,this.numVisited=0,this.inputs=new Set,this.inputsAddr=[],this.output=-1,this._fn=C,this._args=e}var g;return x(I,[{key:"runOnce",value:function(){var g=this;if(void 0===this.executionPromise){var C=O(this.inputs).map((function(I){return I.executionPromise}));this.executionPromise=Promise.all(C).then(c(b.mark((function C(){var e,A,t;return b.wrap((function(C){for(;;)switch(C.prev=C.next){case 0:return e=performance.now(),g.timeWait=(e-I.tick)/1e3,A=performance.now(),C.next=5,g._fn.apply(null,g._args);case 5:return t=C.sent,e=performance.now(),g.timeExecute=(e-A)/1e3,C.abrupt("return",t);case 9:case"end":return C.stop()}}),C)}))))}}},{key:"runFn",value:(g=c(b.mark((function I(){return b.wrap((function(I){for(;;)switch(I.prev=I.next){case 0:return I.next=2,this._fn.apply(null,this._args);case 2:case"end":return I.stop()}}),I,this)}))),function(){return g.apply(this,arguments)})}],[{key:"reset",value:function(){I.nodeId=0}}]),I}();function eI(I,g){var C=Object.keys(I);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(I);g&&(e=e.filter((function(g){return Object.getOwnPropertyDescriptor(I,g).enumerable}))),C.push.apply(C,e)}return C}function AI(I){for(var g=1;g=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function mI(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C>1,I|=I>>2,I|=I>>4,I|=I>>8,I|=I>>16,(I|=I>>32)-(I>>1)}function GI(I,g){var C=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;void 0===g&&(g=I,I=0);for(var e=[],A=I;C>0?Ag;A+=C)e.push(A);return e}!function(I){I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS=100]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS",I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_METAS=101]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_METAS",I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BIAS=102]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BIAS",I[I.WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE=103]="WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE",I[I.WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE=104]="WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE"}(nI||(nI={}));var BI=function(I,g,e){var A=function(g,C){new Int32Array(I.buffer)[g/Int32Array.BYTES_PER_ELEMENT]=C},t=function(){var e=c(b.mark((function e(t,r,c,i,n,l,o,s,d,a,Z){var m,u,G,B,y,V,W,h,R,X,p,H,J,S,w,k,f,F,K,N,E,U,M,Q,T,L,z,x,_,P,j;return b.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=v(t),r=v(r),c=v(c),n=v(n),l=v(l),d=v(d),a=v(a),Z=v(Z),m=D.getXpu(t)){e.next=12;break}return A(Z,-1),e.abrupt("return");case 12:for(u=new Uint8Array(I.buffer),G=Y(u,r),g.addName(d,G),B=new Int32Array(I.buffer),y=B.slice(c/Int32Array.BYTES_PER_ELEMENT,c/Int32Array.BYTES_PER_ELEMENT+2),V=B.slice(n/Int32Array.BYTES_PER_ELEMENT,n/Int32Array.BYTES_PER_ELEMENT+i),W=B.slice(l/Int32Array.BYTES_PER_ELEMENT,l/Int32Array.BYTES_PER_ELEMENT+i),h=new Uint8Array(I.buffer).slice(d,d+s),R=[],X=0,p=0;p1024e4?GI(1,1+k):GI(1+k,1+k+f),F>0&&G.includes("att.v")&&(F>=f?S=GI(1+k+f,1+k+2*f):f===F+1&&(S=[0].concat(O(GI(1+k+f,k+2*f)))))),K=Math.ceil(s/o/S.length)*o,N=s/K,y[0]/=N,E=[],U=s,M=0;case 31:if(!(M=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function XI(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);Cu?A-u:0),y=t-Z,s.push(cI(l.workers[m],{action:Q.COPY_TO_XPU,memAddress:C,offset:G,buffer:d.slice(y,y+B)})),Z-=B),!(Z<=0)){g.next=33;break}return g.abrupt("break",36);case 33:m++,g.next=23;break;case 36:return g.next=38,Promise.all(s);case 38:case"end":return g.stop()}}),g)})));return function(I,C,e,A){return g.apply(this,arguments)}}(),s=function(){var g=c(b.mark((function g(C,e,A,t){var r,c,i,n,l,o,s,d,a,Z,m,u,G,B,y,V,W,h,R,X;return b.wrap((function(g){for(;;)switch(g.prev=g.next){case 0:if(C=v(C),e=v(e),r=D.getMemory(C)){g.next=5;break}return g.abrupt("return");case 5:if(c=r.objAddress,i=r.allocSize,n=r.memFlag,l=r.chunkSize,o=D.getXpu(c),Boolean(4&n)){g.next=13;break}(s=new Uint8Array(I.buffer)).set(s.slice(C+A,C+A+t),e),g.next=49;break;case 13:if(d=[],a=Boolean(2&n),Z=Boolean(8&n),!a&&!Z){g.next=20;break}d.push(cI(o.workers[0],{action:Q.COPY_FROM_XPU,memAddress:C,offset:A,size:i})),g.next=31;break;case 20:m=i,u=0;case 22:if(!(uG?A-G:0,y=Math.min(m,l-B),d.push(cI(o.workers[u],{action:Q.COPY_FROM_XPU,memAddress:C,offset:B,size:y})),m-=y),0!==m){g.next=28;break}return g.abrupt("break",31);case 28:u++,g.next=22;break;case 31:return g.next=33,Promise.all(d);case 33:V=g.sent,W=new Uint8Array(I.buffer),h=0,R=0;case 37:if(!(Rt)){g.next=44;break}return W.set(X.slice(0,t-h),e+h),g.abrupt("break",49);case 44:W.set(X,e+h),h+=X.length;case 46:R++,g.next=37;break;case 49:case"end":return g.stop()}}),g)})));return function(I,C,e,A){return g.apply(this,arguments)}}(),d=function(){var g=c(b.mark((function g(C,e,A){var t,r,c,i,n,l,o,s,d,a;return b.wrap((function(g){for(;;)switch(g.prev=g.next){case 0:if(C=v(C),t=D.getMemory(C)){g.next=4;break}return g.abrupt("return");case 4:if(r=t.objAddress,c=t.allocSize,i=t.memFlag,n=t.chunkSize,l=D.getXpu(r),Boolean(4&i)){g.next=12;break}new Uint8Array(I.buffer).fill(e,C,C+A),g.next=35;break;case 12:if(o=[],!Boolean(8&i)){g.next=18;break}o.push(cI(l.workers[0],{action:Q.MEMSET,memAddress:C,fillByte:e,size:c})),g.next=33;break;case 18:s=Boolean(2&i),d=A,a=0;case 21:if(!(a0&&m.set(u[G],G*s);for(a=[],B=0;B=0;--A){var t=this.tryEntries[A],c=t.completion;if("root"===t.tryLoc)return C("end");if(t.tryLoc<=this.prev){var i=r.call(t,"catchLoc"),n=r.call(t,"finallyLoc");if(i&&n){if(this.prev=0;--C){var e=this.tryEntries[C];if(e.tryLoc<=this.prev&&r.call(e,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),w(C),B}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var e=C.completion;if("throw"===e.type){var A=e.arg;w(C)}return A}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:F(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=e),B}},A}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(H);var J=(0,H.exports)();try{regeneratorRuntime=J}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=J:Function("r","regeneratorRuntime = r")(J)}function w(I){return w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},w(I)}function f(I){var g=function(I,g){if("object"!==w(I)||null===I)return I;var C=I[Symbol.toPrimitive];if(void 0!==C){var e=C.call(I,g||"default");if("object"!==w(e))return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===g?String:Number)(I)}(I,"string");return"symbol"===w(g)?g:String(g)}function F(I,g){for(var C=0;C>>0:I}function v(I,g){for(var C=g;0!==I[C];)C++;return new TextDecoder("utf-8").decode(I.subarray(g,C))}function K(I,g,C){var e=void 0===g?null:g,A=function(I,g){var C=atob(I);if(g){for(var e=new Uint8Array(C.length),A=0,t=C.length;A=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function P(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function q(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C4&&void 0!==arguments[4]?arguments[4]:0,t=I.name,r=this;function i(){return i=c(d.mark((function c(){var i,n,l,o,s,a,b,Z=arguments;return d.wrap((function(c){for(;;)switch(c.prev=c.next){case 0:for(i=Z.length,n=new Array(i),l=0;l=0?n[C]:C,a=e?n[e]:void 0,(b=new CI(t,I,n)).inputsAddr=o,b.output=s,b.subName=r.getName(a),"pvXpuDeviceMemFree"===t||"pvXpuGraphifiedFree"===t?r.addFreeNode(b,o[0]):r.addNode(b,o);case 14:case"end":return c.stop()}}),c)}))),i.apply(this,arguments)}return function(){return i.apply(this,arguments)}}},{key:"addNode",value:function(I,g){this._stack.push(I),this._paths.has(I)||this._paths.set(I,new Set);var C,e=D(g);try{for(e.s();!(C=e.n()).done;)for(var A=C.value,t=this._stack.length-2;t>=0;t--){var r=this._stack[t];if(r.output===A){this._paths.get(r).add(I),I.inputs.add(r);break}}}catch(I){e.e(I)}finally{e.f()}}},{key:"addFreeNode",value:function(I,g){this._stack.push(I),this._paths.has(I)||this._paths.set(I,new Set);for(var C=this._stack.length-2;C>=0;C--){var e=this._stack[C];if(e.inputsAddr.includes(g)){this._paths.get(e).add(I),I.inputs.add(e);break}}}},{key:"executeHelper",value:function(I){var g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(I.numVisited++,I.level=Math.max(g,I.level),!(I.numVisited0;)C.push(g.splice(0,8));e=0,A=C;case 5:if(!(ewait: ').concat(r.timeWait.toFixed(4),", execute: ").concat(r.timeExecute.toFixed(4),'>, style=filled, fillcolor="').concat(II(r.level),'"]\n');var i,n=D(c);try{for(n.s();!(i=n.n()).done;){var l=i.value;e+=" ".concat(r.id," -> ").concat(l.id,"\n")}}catch(I){n.e(I)}finally{n.f()}}}catch(I){A.e(I)}finally{A.f()}var o="digraph {\n".concat(g,"\n").concat(e,"}");console.log(o)}},{key:"clear",value:function(){this._paths.clear(),this._stack=[],CI.reset()}}]),I}(),CI=function(){function I(g,C,e){Q(this,I),t(this,"id",void 0),t(this,"name",void 0),t(this,"subName",void 0),t(this,"visited",void 0),t(this,"numVisited",void 0),t(this,"executionPromise",void 0),t(this,"inputs",void 0),t(this,"inputsAddr",void 0),t(this,"output",void 0),t(this,"timeWait",0),t(this,"timeExecute",0),t(this,"level",0),t(this,"_fn",void 0),t(this,"_args",void 0),this.id=I.nodeId++,this.name=g,this.visited=!1,this.numVisited=0,this.inputs=new Set,this.inputsAddr=[],this.output=-1,this._fn=C,this._args=e}var g;return x(I,[{key:"runOnce",value:function(){var g=this;if(void 0===this.executionPromise){var C=j(this.inputs).map((function(I){return I.executionPromise}));this.executionPromise=Promise.all(C).then(c(d.mark((function C(){var e,A,t;return d.wrap((function(C){for(;;)switch(C.prev=C.next){case 0:return e=performance.now(),g.timeWait=(e-I.tick)/1e3,A=performance.now(),C.next=5,g._fn.apply(null,g._args);case 5:return t=C.sent,e=performance.now(),g.timeExecute=(e-A)/1e3,C.abrupt("return",t);case 9:case"end":return C.stop()}}),C)}))))}}},{key:"runFn",value:(g=c(d.mark((function I(){return d.wrap((function(I){for(;;)switch(I.prev=I.next){case 0:return I.next=2,this._fn.apply(null,this._args);case 2:case"end":return I.stop()}}),I,this)}))),function(){return g.apply(this,arguments)})}],[{key:"reset",value:function(){I.nodeId=0}}]),I}();function eI(I,g){var C=Object.keys(I);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(I);g&&(e=e.filter((function(g){return Object.getOwnPropertyDescriptor(I,g).enumerable}))),C.push.apply(C,e)}return C}function AI(I){for(var g=1;g=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function mI(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);C>1,I|=I>>2,I|=I>>4,I|=I>>8,I|=I>>16,(I|=I>>32)-(I>>1)}function BI(I,g){var C=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;void 0===g&&(g=I,I=0);for(var e=[],A=I;C>0?Ag;A+=C)e.push(A);return e}!function(I){I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS=100]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS",I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_METAS=101]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_METAS",I[I.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BIAS=102]="WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BIAS",I[I.WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE=103]="WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE",I[I.WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE=104]="WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE"}(nI||(nI={}));var yI=function(I,g,e){var A=function(g,C){new Int32Array(I.buffer)[g/Int32Array.BYTES_PER_ELEMENT]=C},t=function(){var e=c(d.mark((function e(t,r,c,i,n,l,o,s,a,b,Z){var m,u,B,y,G,V,h,W,R,p,X,H,k,S,J,w,f,F,K,N,E,U,M,L,T,Q,z,x,_,P,D;return d.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Y(t),r=Y(r),c=Y(c),n=Y(n),l=Y(l),a=Y(a),b=Y(b),Z=Y(Z),m=O.getXpu(t)){e.next=12;break}return A(Z,-1),e.abrupt("return");case 12:for(u=new Uint8Array(I.buffer),B=v(u,r),g.addName(a,B),y=new Int32Array(I.buffer),G=y.slice(c/Int32Array.BYTES_PER_ELEMENT,c/Int32Array.BYTES_PER_ELEMENT+2),V=y.slice(n/Int32Array.BYTES_PER_ELEMENT,n/Int32Array.BYTES_PER_ELEMENT+i),h=y.slice(l/Int32Array.BYTES_PER_ELEMENT,l/Int32Array.BYTES_PER_ELEMENT+i),W=new Uint8Array(I.buffer).slice(a,a+s),R=[],p=0,X=0;X1024e4?BI(1,1+w):BI(1+w,1+w+f),F>0&&B.includes("att.v")&&(F>=f?S=BI(1+w+f,1+w+2*f):f===F+1&&(S=[0].concat(j(BI(1+w+f,w+2*f)))))),K=Math.ceil(s/o/S.length)*o,N=s/K,G[0]/=N,E=[],U=s,M=0;case 31:if(!(M=I.length?{done:!0}:{done:!1,value:I[e++]}},e:function(I){throw I},f:A}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t,r=!0,c=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return r=I.done,I},e:function(I){c=!0,t=I},f:function(){try{r||null==C.return||C.return()}finally{if(c)throw t}}}}function pI(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,e=new Array(g);Cu?A-u:0),G=t-Z,s.push(cI(l.workers[m],{action:L.COPY_TO_XPU,memAddress:C,offset:B,buffer:a.slice(G,G+y)})),Z-=y),!(Z<=0)){g.next=33;break}return g.abrupt("break",36);case 33:m++,g.next=23;break;case 36:return g.next=38,Promise.all(s);case 38:case"end":return g.stop()}}),g)})));return function(I,C,e,A){return g.apply(this,arguments)}}(),s=function(){var g=c(d.mark((function g(C,e,A,t){var r,c,i,n,l,o,s,a,b,Z,m,u,B,y,G,V,h,W,R,p;return d.wrap((function(g){for(;;)switch(g.prev=g.next){case 0:if(C=Y(C),e=Y(e),r=O.getMemory(C)){g.next=5;break}return g.abrupt("return");case 5:if(c=r.objAddress,i=r.allocSize,n=r.memFlag,l=r.chunkSize,o=O.getXpu(c),Boolean(4&n)){g.next=13;break}(s=new Uint8Array(I.buffer)).set(s.slice(C+A,C+A+t),e),g.next=49;break;case 13:if(a=[],b=Boolean(2&n),Z=Boolean(8&n),!b&&!Z){g.next=20;break}a.push(cI(o.workers[0],{action:L.COPY_FROM_XPU,memAddress:C,offset:A,size:i})),g.next=31;break;case 20:m=i,u=0;case 22:if(!(uB?A-B:0,G=Math.min(m,l-y),a.push(cI(o.workers[u],{action:L.COPY_FROM_XPU,memAddress:C,offset:y,size:G})),m-=G),0!==m){g.next=28;break}return g.abrupt("break",31);case 28:u++,g.next=22;break;case 31:return g.next=33,Promise.all(a);case 33:V=g.sent,h=new Uint8Array(I.buffer),W=0,R=0;case 37:if(!(Rt)){g.next=44;break}return h.set(p.slice(0,t-W),e+W),g.abrupt("break",49);case 44:h.set(p,e+W),W+=p.length;case 46:R++,g.next=37;break;case 49:case"end":return g.stop()}}),g)})));return function(I,C,e,A){return g.apply(this,arguments)}}(),a=function(){var g=c(d.mark((function g(C,e,A){var t,r,c,i,n,l,o,s,a,b;return d.wrap((function(g){for(;;)switch(g.prev=g.next){case 0:if(C=Y(C),t=O.getMemory(C)){g.next=4;break}return g.abrupt("return");case 4:if(r=t.objAddress,c=t.allocSize,i=t.memFlag,n=t.chunkSize,l=O.getXpu(r),Boolean(4&i)){g.next=12;break}new Uint8Array(I.buffer).fill(e,C,C+A),g.next=35;break;case 12:if(o=[],!Boolean(8&i)){g.next=18;break}o.push(cI(l.workers[0],{action:L.MEMSET,memAddress:C,fillByte:e,size:c})),g.next=33;break;case 18:s=Boolean(2&i),a=A,b=0;case 21:if(!(b0&&m.set(u[B],B*s);for(b=[],y=0;y